【问题标题】:Find group of elements in recursive parent-child with XPath使用 XPath 在递归父子中查找元素组
【发布时间】:2015-12-18 07:35:52
【问题描述】:

我需要在递归父子属性内的 xml 文件中找到一个子节点。这是一个 xml 示例:

<root>
    <element>
        <nodeA>
            <nodeB>
                <nodeA>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>
                            <nodeB></nodeB>
                            <nodeB></nodeB>         
                        </nodeA>
                    </nodeB>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>
                            <nodeB></nodeB>                     
                        </nodeA>            
                    </nodeB>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>                     
                        </nodeA>            
                    </nodeB>                        
                </nodeA>
            </nodeB>
            <nodeB>
                <nodeA>
                    <nodeB>
                        <nodeA>
                            <nodeB></nodeB>                     
                        </nodeA>
                    </nodeB>            
                </nodeA>            
            </nodeB>
        </nodeA>
    </element>
</root>

我可以找到所有没有 nodeA 子节点的节点:

//nodeB[not(nodeA)]

但我需要选择第一个(并且只有第一个)nodeB 组而没有 nodeA 子级,实际上是上面示例中 nodeB 的前 三个 出现。

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    这里是

    (//nodeA)[nodeB[not(nodeA)]][1]/nodeB
    

    您的 XPath 几乎是正确的 - 您只需要在一个级别(到 nodeA 组)上 UP 并选择第一个。请注意,XPath 集合是 1-indexed 而不是经典的 0-indexed。

    UPD:和圆括号正确控制运算符的优先级。

    【讨论】:

    • 那个对我不起作用(选择所有叶级nodeB而不是前三个)但是这个有效(我刚刚修改了你的)(//nodeA)[nodeB[not(nodeA)]][1]/nodeB
    • 太好了,直接写到这里了,加了圆括号来正确地优先考虑运算符。
    【解决方案2】:

    通过您已经得到的查询,您离您想要的只有几步之遥。

    从//nodeB[not(nodeA)]开始你想上一级到父级/..,但是你只想要第一组的父级(//nodeB[not(nodeA)]/..)[1]当然你想要没有子节点的nodeB至于最终结果:

    (//nodeB[not(nodeA)]/..)[1]/nodeB[not(nodeA)]
    

    【讨论】:

    • 谢谢,它有效。最后一个 not(nodeA) 没用。我用过这个 (//nodeB[not(nodeA)]/..)[1]/nodeB.
    • 没用?如果结构以&lt;nodeA&gt;&lt;nodeB/&gt;&lt;nodeB/&gt;&lt;nodeB&gt;&lt;nodeA/&gt;&lt;/nodeB&gt;&lt;/nodeA&gt; 结束,您是否想要包含nodeA 的第三个nodeB?在最终测试中包含 not(nodeA) 可以防止出现这种情况。
    猜你喜欢
    • 2018-07-09
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多