提问人:Maciek 提问时间:7/14/2023 更新时间:7/14/2023 访问量:51
PHP 简单 XML Xpath 向上移动树(带名称的父项)
PHP Simple XML Xpath Move Up Tree (Parent with Name)
问:
我正在使用带有SimpleXML的Xpath来查找子元素,如下所示:
$child=$file->xpath('//w:child')[0];
如果我想选择父级,我可以做:
$parent=$child->xpath('..')[0];
但是,如果我想在树的任何级别找到一个名为“any_parent”的父母或祖父母怎么办?例如:
$any_parent=$child->xpath('any_parent//..')[0];
这可能吗?我希望它是相对于 的。然后向上移动树并选择标签。有没有办法做到这一点?$child
any_parent
答:
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()/
评论