【问题标题】:Java XPath get all nodes with specific tag matching specific textJava XPath 获取具有与特定文本匹配的特定标记的所有节点
【发布时间】:2016-02-05 14:18:58
【问题描述】:

我有以下常规XML 文件:

<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>

我想获取所有节点(所有&lt;Item&gt;),其中&lt;tag1&gt; 文本等于text1,然后打印它们的所有其他标签,例如&lt;tag2&gt;

我从这个开始,但努力寻找 TODO'S 的答案:

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();}

谢谢,

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    您可以使用 Chrome 开发者工具 $x("path") 函数来测试 XPath。这真的很容易。它也适用于最新的 Firefox。

    我使用您提供的文本制作了一个 HTML 文件并在 Chrome 中打开它。在控制台中,输入$x("/some-path") 进行测试。

    1. 获取物品:

      //Item
      
    2. 其中 tag1 文本等于 text1:

      //Item/tag1[.='text1']
      
    3. 获取以下同级,即 tag2:

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

    如果你想要的是 Item 而不是 tag2:

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

    【讨论】:

    • 但是我使用 Java 并且不需要像 //root//Items//Item// 这样的所有路径以使搜索更有效吗?谢谢,
    • 我不想要下面的兄弟姐妹,因为通常我有更多的标签。我编辑了问题
    • 你可以使用相同的XPathin java!如果您至少使用 XPath 2。以后担心性能。可能不会有什么不同。
    • 我有 180K &lt;item&gt; 个节点
    • @michael,此时需要获取包含tag1=text1的Item节点。然后就可以分别处理节点的子节点了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2023-03-23
    • 2011-01-30
    相关资源
    最近更新 更多