2015-11-04 76 views
2

我有以下的常規XML文件:的Java的XPath獲得具有特定標籤的所有節點匹配特定的文本

<root> 
    <Items> 
     <Item> 
      <tag1>text1</tag1> 
      <tag2>text2</tag2> 
      <tag3>text3</tag3> 
     </Item> 
     <Item> 
      <tag1>text1</tag1> 
      <tag2>text4</tag2> 
      <tag3>text5</tag3> 
     </Item> 
    </Items> 
</root> 

而且我想要得到的所有節點(所有<Item>)其中<tag1>文本等於text1,然後打印他們的所有其他標籤,例如<tag2>

我開始用這個,但苦苦尋找答案,將要做的:

try { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(("\URI\file.xml")); 
    XPathFactory xPathfactory = XPathFactory.newInstance(); 
    XPath xpath = xPathfactory.newXPath(); 
    //TODO: Is this correct query? 
    XPathExpression expr = xpath.compile("//root//Items//Item//tag1[contains(., 'text1')]"); 
    NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
    for (int i=0; i<nl.getLength(); i++) { 
     //TODO: How to iterate over all matched <Item> and get their <tag2>, <tag3> etc.? 
    } 
} catch (Exception e) {e.printStackTrace();} 

感謝,

回答

5

您可以使用Chrome開發者工具進行測試的XPath $x("path")功能。這很容易。它也適用於最新的Firefox。

我用您提供的文本製作了一個HTML文件,並在Chrome中打開它。在控制檯中輸入$x("/some-path")來測試東西。

  1. 獲取項目:

  2. 其中Tag1文本text1的相等:

    //Item/tag1[.='text1'] 
    
  3. 獲取以下同級這是一個標籤2:

    //Item/tag1[.='text1']/following-sibling::tag2 
    

如果你想要的項目,而不是標籤2:

//Item[ ./tag1[.='text1']/following-sibling::tag2 ] 
+0

但是我用Java和沒有我需要把像// //根項目//項目的所有路徑//爲了使搜索更有效率?謝謝, – michael

+0

,我不想要下面的兄弟姐妹,因爲一般情況下我有更多的標籤。我編輯了這個問題 – michael

+0

你可以使用相同的XPathin java!如果您至少使用XPath 2。以後擔心表現。它可能不會有所作爲。 –

相關問題