PHP 简单 XML Xpath 向上移动树(带名称的父项)

PHP Simple XML Xpath Move Up Tree (Parent with Name)

提问人:Maciek 提问时间:7/14/2023 更新时间:7/14/2023 访问量:51

问:

我正在使用带有SimpleXML的Xpath来查找子元素,如下所示:

$child=$file->xpath('//w:child')[0];

如果我想选择父级,我可以做:

$parent=$child->xpath('..')[0];

但是,如果我想在树的任何级别找到一个名为“any_parent”的父母或祖父母怎么办?例如:

$any_parent=$child->xpath('any_parent//..')[0];

这可能吗?我希望它是相对于 的。然后向上移动树并选择标签。有没有办法做到这一点?$childany_parent

php xml simplexml

评论


答:

2赞 hakre 7/14/2023 #1

是的,这是轴。ancestor

您正在寻找名为 :any_parent

ancestor::any_parent

^ 这是轴的名称(祖先查看全部),两个冒号(“::”)和节点测试,这里是元素名称。

PHP/SimpleXML功能:

$any_parent = $child->xpath('ancestor::any_parent')[0];

注意:由于可以没有或多个,因此直接访问可能会给您带来意想不到的结果。[0]

您可以提供默认值,例如表示未找到任何节点,以及位置测试来表示您具体想要第一个节点:null

$any_parent = $child->xpath('ancestor::grandparent[1]')[0] ?? null;

艺术

[$any_parent] = $child->xpath('ancestor::grandparent[1]') + [null];

评论

0赞 Maciek 7/14/2023
如果有命名空间,这会起作用吗?例如 w:parent,ancestor::w:parent 是否有效?另外,如果你做 ./ancestor vs //ancestor vs ancestor 有区别吗?
1赞 hakre 7/14/2023
是的,轴/轴带有命名空间,它是您检查命名空间的节点测试,所以是的,有效。 和实际上是一样的,是上下文节点的缩写,$child。 会破坏你的结果,因为是 的缩写,所以你会在这里跨越两个轴,包括后代,但你想要祖先(任何父母、祖父母、祖父母......不是孩子,孙子......axis::prefix:local-name./ancestor::*ancestor::*.//ancestor///descendant-or-self::node()/