Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath:从子节点获取父节点_Xml_Xpath - Fatal编程技术网

Xml XPath:从子节点获取父节点

Xml XPath:从子节点获取父节点,xml,xpath,Xml,Xpath,我需要为子节点获取父节点title 50 目前我只使用 //*[title="50"] 我怎样才能得到它的父母? 结果应该是存储节点 荣誉之剑 小说 伊芙琳·沃 白鲸 小说 赫尔曼·梅尔维尔 0-553-21311-3 50 参考 检控官里斯 指环王 小说 托尔金 0-395-19395-8 卡纳代尔 红色 将与父节点的名称一起使用 //*[title="50"]/parent::store 如果父节点是存储,则此XPath将仅选择父节点 但是你也可以使用其中的一个 //*[title=

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

目前我只使用

//*[title="50"]
我怎样才能得到它的父母? 结果应该是
存储
节点



荣誉之剑
小说
伊芙琳·沃
白鲸
小说
赫尔曼·梅尔维尔
0-553-21311-3
50
参考
检控官里斯
指环王
小说
托尔金
0-395-19395-8
卡纳代尔
红色
将与父节点的名称一起使用

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

如果父节点是
存储
,则此XPath将仅选择父节点

但是你也可以使用其中的一个

//*[title="50"]/parent::*
//*[title="50"]/..
这些XPath将选择任何父节点。因此,如果文档发生更改,您将始终选择一个节点,即使它不是您期望的节点

编辑

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

它会上升吗

否,仅当存储是与
//*[title=“50”]
匹配的节点的父节点时,它才会选择该存储

如果没有,是否有一种方法在这种情况下提升,如果没有这样的父母,则返回None

是的,您可以使用
祖先

//*[title="50"]/ancestor::store
这将选择与`存储'匹配的节点的所有祖先。例如

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

50
参考

作为替代,您可以使用
祖先

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

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

这在我的情况下有效。我希望你能从中提取意义

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

你也可以用表达式末尾的两点。请参见此示例:

//*[title="50"]/..
对老问题的新的、改进的回答…

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

使用谓词而不是
父::
祖先::
轴 这里的大多数答案选择
标题
,然后遍历到目标父级或祖先(
存储
)元素。一种更简单、直接的方法是首先直接选择父元素或祖先元素,避免了遍历到
父元素:
祖先:
轴:

//*[book/title = "50"]
如果中间元素的名称不同:

//*[*/title = "50"]
或者,在名称和深度上:

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

您还可以使用
父级::*
缩写语法
(示例:
/*[title=“50”]/..
)或嵌套谓词(示例:
/*[*[title=“50”]]
)附加信息:和或与快捷方式
相对应的
父级::节点()
,在我看来更好。事实上,
父节点::*
仅限于axis的主节点类型,在大多数情况下这不是问题。如果您使用的是try
.xpath(“…”)
xpath('parent::node()')
“此xpath将仅选择父节点(如果它是存储)。”-在给定示例中,如果父对象是
bicycle
,但父对象的父对象是
store
,会发生什么情况?它会上升吗?如果没有,是否有一种方法在这种情况下提升并返回
None
如果没有这样的父级?它不是“更强大”。只是不同而已。因此,轴的选择取决于用例。这并不能回答问题。作者不一定提前知道家长的名字。@KennSebesta:我已经更新了答案以解决您的问题。如果您的反对意见已经得到解决,请取消您的否决票,或者如果您觉得答案仍然有问题,请告诉我。谢谢
//*[.//title = "50"]