2013-03-18 48 views
0

我已經在Java/XPath和Namepsaces這個主題上看到了相當多的討論,但我不確定這些問題的答案可以幫助解決我的特定問題。XML格式未知時的Java XPath命名空間

我有一個程序可以獲得一些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); 
} 

任何幫助非常感謝。

感謝

+1

您可以禁用命名空間支持,但在運動前我沒有實際的代碼。這是一個單一的行,所以一點點,但谷歌搜索應該爲你解決它 – MadProgrammer 2013-03-18 20:24:45

+0

謝謝你。我將代碼更改爲此,並且所有工作都正常: '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); 返回結果;' – user265330 2013-03-19 10:24:07

+0

是的,這看起來是正確的 – MadProgrammer 2013-03-19 10:32:34

回答

2

從本質上講,像

/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'] 
1

從 「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; 

謝謝。