[英]Java XPath Namespaces when format of XML is unknown
我已經在Java / XPath和Namepsaces主題上進行了很多討論,但是我不確定這些問題的答案是否可以解決我的特定問題。
我有一個可以容納一些XML的程序-我事先不知道格式,但是它可能包含名稱空間。 用戶可以提供一個xpath表達式,該表達式將用於從XML中提取特定的數據。 代碼是通用的-我無法在任何名稱空間或類似名稱中進行編譯,因為我不預先知道XML的格式。
因此,XML可能如下所示:
<ns1:item id='myroot' xmlns:ns1='http://www.myplace.com/place'>
<ns1:category id='cat1'>
<ns1:item id='item1'>
<ns1:category id='cat2'></ns1:category>
</ns1:item>
</ns1:category>
</ns1:item>
用戶輸入的xpath可能是:
/ns1:item[@id='myroot']/ns1:category[@id='cat1']
但是使用以下代碼,我始終一無所獲(無論我嘗試使用哪種XPath):
public static String evaluate(String xml, String xpathExpression) throws Exception
{
String result = "";
InputSource is = new InputSource(new StringReader(xml));
XPath xPath = XPathFactory.newInstance().newXPath();
result = xPath.evaluate(xpathExpression, is);
System.out.println("result=" +result);
}
任何幫助,不勝感激。
謝謝
本質上,類似
/ns1:item[@id='myroot']/ns1:category[@id='cat1']
除非您知道ns1指的是什么,否則它是沒有意義的。 因此,如果用戶以這種形式提供表達式,那么他們還需要告訴您ns1的含義。
XPath 3.0(最后)提供了一種定義不依賴前綴綁定的XPath表達式的方法:您可以編寫
/Q{http://www.myplace.com/place}item[@id='myroot']/Q{http://www.myplace.com/place}category[@id='cat1']
但是在1.0和2.0中實現此目標的唯一方法是編寫
/*[local-name()='item' and namespace-uri()='http://www.myplace.com/place'][@id='myroot']/*[local-name()='category' and namespace-uri()='http://www.myplace.com/place'][@id='cat1']
來自“ MadProgrammer”的評論幫助我找到了所需的答案:
String result = "";
DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();
xmlFactory.setNamespaceAware(false);
DocumentBuilder builder = xmlFactory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xml));
Document document = builder.parse(is);
XPath xPath = XPathFactory.newInstance().newXPath();
result = xPath.evaluate(xpathExpression, document);
return result;
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.