gpt4 book ai didi

php - XPath:检索当前节点的所有祖先,但是在找到特定节点时停止

转载 作者:行者123 更新时间:2023-12-03 17:09:39 27 4
gpt4 key购买 nike

XML范例:

<node-root>
<node-1>
<node-2>
....
<node-1000>
<node-1001>
<node-1002>
text
</node-1002>
</node-1001>
</node-1000>
....
</node-2>
</node-1>
</node-root>


我想要的是检索文本节点的所有祖先,直到 <node-1000>
我的XPath查询(PHP):

$parentNodes = $xpath->query("ancestor::*" , $textNode);

$textNode是文本节点,其中包含 text。在PHP中,这意味着从该节点执行查询。
显然,此表达式尝试查找所有祖先,但这会导致不必要的资源消耗。就我而言,我不想搜索比 <node-1000>更深的父节点。有没有办法在 <node-1000>之后停止查询执行。
假设在满足 <node-1000>之前我不知道应该执行多少步骤。因此不能使用: ../

最佳答案

您应该可以使用

$parentNodes = $xpath->query("ancestor::*[node-1000]/*" , $textNode);


这将为您提供 <node-1000>元素,或者

$parentNodes = $xpath->query("ancestor::*[node-1000]//*" , $textNode);


(带有// *),它将提取所有直到 <node-1000>的节点。

编辑:测试代码...

$data = <<< XML
<node-root>
<node-1>
<node-2>
....
<node-1000>
<node-1001>
<node-1002>
text
</node-1002>
</node-1001>
</node-1000>
....
</node-2>
</node-1>
<node-1>
<node-2>
....
<node-1000>
<node-a></node-a>
<node-c></node-c>
<node-100>
<n></n>
<node-1002>
text2
</node-1002>
</node-100>
</node-1000>
....
</node-2>
</node-1></node-root>
XML;
$xml = new DOMDocument();
$xml->loadXML($data);
$xpath = new DOMXPath($xml);
// Next line - use item(0) to pick first, 1 for second
$textNode = $xpath->query("//node-1002")->item(1)->childNodes[0];
echo $xml->saveXML($textNode);
$parentNodes = $xpath->query("ancestor::*[node-1000]//*" , $textNode);
echo count($parentNodes).PHP_EOL;
echo $xml->saveXML($parentNodes->item(0));


第二项输出...

          text2
1
<node-1000>
<node-a/>
<node-c/>
<node-100>
<n/>
<node-1002>
text2
</node-1002>
</node-100>
</node-1000>

关于php - XPath:检索当前节点的所有祖先,但是在找到特定节点时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488622/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com