2012-04-10 77 views
5

我有XML的部分看起來像這樣:如何讓Xpath的節點值 - Java的

<entry> 
<id>tag:example.com,2005:Release/343597</id> 
<published>2012-04-10T11:29:19Z</published> 
<updated>2012-04-10T12:04:41Z</updated> 
<link type="text/html" href="http://example.com/projects/example1" rel="alternate"/> 
<title>example1</title> 
</entry> 

我需要抓住從此塊鏈接http://example.com/projects/example1。我不知道如何做到這一點。爲了獲得該項目的標題我用這個代碼:

String title1 = children.item(9).getFirstChild().getNodeValue(); 

其中children對於<entry> </entry>getChildNodes()對象。但是當我嘗試以類似的方式獲取<link>節點的節點值時,我總是收到NullPointerExceptions。我看到<link>節點的XML代碼是不同的,我不確定它的價值是什麼....請指教!

+0

你需要爲這個XPath語法?或者您需要Java API語法? – 2012-04-10 18:31:28

+1

啊,好的問題,尋找Java API的語法。但我明白了,看下面。謝謝 – blaughli 2012-04-10 19:01:13

回答

13

XPath表達式來獲取節點是

//entry/link/@href 

在Java中,你可以寫

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
String href = xp.evaluate(doc); 

然後,如果你需要一個特定的id你可以改變,以獲得進入的link值xpath表達式爲

//entry[id='tag:example.com,2005:Release/343597']/link/@href 

最後if你想獲得的文件的所有鏈接,如果文件有許多項元素,你可以寫

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
NodeList links = (NodeList) xp.evaluate(doc, XPathConstants.NODESET); 
// and iterate on links 
+1

謝謝你,你把我推向了正確的方向。使用您提供的語法,我可以評估編譯的Xpath表達式(將結果作爲「NODESET」返回)。然後,我從結果(NODESET)中創建了一個NodeList,然後用一個while循環遍歷所有來自我正在閱讀的RSS頁面的鏈接。非常感謝你 :)。 – blaughli 2012-04-10 19:03:59

+0

我也向答案添加了'NodeList'示例。爲了完整性。 – dash1e 2012-04-10 19:10:28

6

下面是完整的代碼:

DocumentBuilderFactory domFactory = DocumentBuilderFactory 
      .newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("test.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr = xpath.compile("//entry/link/@href"); 
    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    for (int i = 0; i < nodes.getLength(); i++) { 
     System.out.println(nodes.item(i)); 
    } 
+0

謝謝Phani,那正是我所做的。 – blaughli 2012-04-10 19:08:46