2015-11-04 42 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。以后担心表现。它可能不会有所作为。 –

相关问题