2011-03-22 48 views
2

我試圖檢索XML文件中的單個元素的值。我已經截斷了XML的相關位:與使用XPath Java的唯一項查詢XML沒有返回

<opt> 
    <security> 
     <check> 
      <secure>true</secure> 
     </check> 
    </security> 
</opt> 

我試圖從'安全'元素檢索'真'。

我有以下代碼:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setNamespaceAware(true); 
DocumentBuilder builder=domFactory.newDocumentBuilder(); 
Document doc = builder.parse(file); 

XPath xpath=XPathFactory.newInstance().newXPath(); 
XPathExpression expr=xpath.compile("//opt/security/check/secure/text()"); 

Object result = expr.evaluate(doc, XPathConstants.STRING); 
logger.warn(result.toString()); 

我只是試圖讓任何價值,現在,一旦我得到這個工作,我會改變字符串爲布爾值。

我的輸出是空白的,我已經嘗試了一堆不同的東西,包括以下的教程和使用的NodeLists(儘管這並沒有多大的意義對我來說,因爲這是一個獨特的元素)。我錯過了什麼嗎?

謝謝!

+0

顯然,這是一個命名空間的問題...... – 2011-03-22 23:07:09

回答

2

你的代碼工作用我的JVM(太陽/ Oracle的Java的Windows系統)默認XPath實現:

>java -version 
java version "1.6.0_20" 
Java(TM) SE Runtime Environment (build 1.6.0_20-b02) 
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode) 

雙斜槓不是樣本文檔中必要的; as MSDN notes

使用雙正斜槓(//)的表達式表示可以包含零級或更多層級的搜索。

我不知道這是一個命名空間的問題:

domFactory.setNamespaceAware(true); 

你可能忽略了此行或providing a NamespaceContext

+0

的省略工作就像一個魅力,我可以發誓,我嘗試過刪除。另外,我也沒有聲明任何命名空間(這引發了我爲什麼使用NamespaceAware的問題,我猜)。無論如何,**非常感謝!** – Bharat 2011-03-22 13:11:48

+0

+1對於當架構是衆所周知的不'開始'//操作。我想你應該引用XPath的規範,而不是MSDN ... -1'setNamespaceAware(假);':如果你打算使用XML,你需要知道XML ... – 2011-03-22 23:06:13