【问题标题】:XPath: Get parent node from child nodeXPath:从子节点获取父节点
【发布时间】:2015-03-30 00:50:47
【问题描述】:

我需要获取子节点title 50的父节点

目前我只使用

//*[title="50"]

我怎样才能得到它的父母? 结果应该是store 节点。


<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
    <store d:mi="22">
        <book price="12.99" d:price="Number" d:mi="4">
            <title d:constr="String" d:mi="1">Sword of Honour</title>
            <category d:constr="String" d:mi="2">fiction</category>
            <author d:constr="String" d:mi="3">Evelyn Waugh</author>
        </book>
        <book price="8.99" d:price="Number" d:mi="9">
            <title d:constr="String" d:mi="5">Moby Dick</title>
            <category d:constr="String" d:mi="6">fiction</category>
            <author d:constr="String" d:mi="7">Herman Melville</author>
            <isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
        </book>
        <book price="8.95" d:price="Number" d:mi="13">
            <title d:constr="String" d:mi="10">50</title>
            <category d:constr="String" d:mi="11">reference</category>
            <author d:constr="String" d:mi="12">Nigel Rees</author>
        </book>
        <book price="22.99" d:price="Number" d:mi="18">
            <title d:constr="String" d:mi="14">The Lord of the Rings</title>
            <category d:constr="String" d:mi="15">fiction</category>
            <author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
            <isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
        </book>
        <bicycle price="19.95" d:price="Number" d:mi="21">
            <brand d:constr="String" d:mi="19">Cannondale</brand>
            <color d:constr="String" d:mi="20">red</color>
        </bicycle>
    </store>
</d:data>

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    使用带有父节点名称的parent axes

    //*[title="50"]/parent::store
    

    如果它是store,这个XPath 只会选择父节点。

    但你也可以使用其中之一

    //*[title="50"]/parent::*
    //*[title="50"]/..
    

    这些 xpath 将选择任何父节点。因此,如果文档发生更改,您将始终选择一个节点,即使它不是您期望的节点。

    编辑

    在给定示例中,如果父项是自行车,但父项的父项是商店,会发生什么情况?

    它会上升吗?

    不,只有当它是匹配//*[title="50"]的节点的父节点时才会选择商店。

    如果没有,有没有一种方法可以在这种情况下上升,如果没有这样的父级,则返回 None?

    是的,你可以使用ancestor

    //*[title="50"]/ancestor::store
    

    这将选择与//*[title="50"] 匹配的节点的所有祖先,它们是` 存储。例如

    <data xmlns:d="defiant-namespace" d:mi="23">
        <store mi="1">
            <store mi="22">
                <book price="8.95" d:price="Number" d:mi="13">
                    <title d:constr="String" d:mi="10">50</title>
                    <category d:constr="String" d:mi="11">reference</category>
                    <author d:constr="String" d:mi="12">Nigel Rees</author>
                </book>
            </store>
        </store>
    </data>
    

    【讨论】:

    • 您也可以使用parent::* 缩写语法..(例如://*[title="50"]/..)或嵌套​​谓词(例如://*[*[title="50"]]
    • parent::node() 对应于快捷方式..,在我看来更好。事实上parent::* 仅限于轴的主节点类型,在大多数情况下这不是问题。
    • 如果你正在使用尝试.xpath('..')xpath('parent::node()')
    • "如果它是一个商店,这个 XPath 只会选择父节点。" - 在给定的例子中会发生什么,其中父母是bicycle,但父母的父母是store?它上升吗?如果没有,有没有一种方法可以在这种情况下上升并在没有这样的父级时返回None
    【解决方案2】:

    您也可以使用ancestor

    //*[title="50"]/ancestor::store
    

    它比parent更强大,因为它甚至可以得到祖父母或曾曾祖父母

    【讨论】:

    • 它不是“更强大”。只是不同而已。因此,轴的选择取决于用例。
    【解决方案3】:

    这适用于我的情况。我希望你能从中提取意义。

    //div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
    

    【讨论】:

    • 我无法在正确的上下文中理解您的示例。
    【解决方案4】:

    您也可以使用表达式末尾的两个点。看这个例子:

    //*[title="50"]/..
    

    【讨论】:

      【解决方案5】:

      对旧的常见问题的改进的新答案...

      我怎样才能得到它的父母?结果应该是store 节点。

      使用谓词而不是 parent::ancestor::

      这里的大多数答案选择title,然后向上遍历到目标父或祖先(store)元素。一种更简单直接的方法是首先直接选择父元素或祖先元素,无需遍历parent::ancestor:: 轴:

      //*[book/title = "50"]
      

      如果中间元素名称不同:

      //*[*/title = "50"]
      

      或者,在名称和深度上:

      //*[.//title = "50"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多