2011-11-08 138 views
4

我使用XPath來解析RSS XML數據與CDATA標籤的節點值,並且數據如何使用XPath找到的java

<rss version="2.0"> 
    <channel> 
    <title> 
     <![CDATA[sports news]]> 
    </title> 
    </channel> 
</rss> 

我想使用XPath「來獲取文本「體育新​​聞」/rss/channel/title/text()「,但結果不是我想要的,真正的結果是」\ r \ n「,所以如何找到我想要的結果。

的代碼如下:

 
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); 
    XPathFactory xpathFactory = XPathFactory.newInstance(); 
    XPath xPath = xpathFactory.newXPath(); 
    Node node = (Node) xPath.evaluate("/rss/channel/title/text()", doc,XPathConstants.NODE); 
    String title = node.getNodeValue(); 

回答

3

嘗試調用您的DocumentBuilderFactory setCoalescing(true),這將摺疊所有CDATA /文本節點爲單節點。

+0

或傳遞XPathConstants.NODESET,並將評估分配給NodeList。但合併更容易。 – MeBigFatGuy

+2

正式的,在XPath數據模型中,文本節點永遠不會被分割,所以你的查詢應該返回你期望的結果。實際上,在DOM上工作的一些XPath實現將無法連接相鄰的文本節點。一種解決方案是避免使用text()(而不是使用元素上的string());另一個是按照建議使用setCoalescing()第三個是使用符合標準的XPath處理器,例如Saxon。 –

0

你可以嘗試改變XPath表達式

"string(/rss/channel/title)" 

,並使用返回類型字符串,而不是節點:

Node node = (Node) xPath.evaluate("string(/rss/channel/title)", doc, 
            XPathConstants.STRING); 

這樣,你是不是選擇一個文本節點,而是字符串值標題元素由所有後代文本節點的連接組成。