Php 使用XPath 1获取两个XPath节点之间的文本。通用解决方案,而不是特殊情况
有没有办法用XPath 1获取两个节点之间的文本 示例:我们希望得到F和D之间的文本,预期结果为“G” 最后,函数:Php 使用XPath 1获取两个XPath节点之间的文本。通用解决方案,而不是特殊情况,php,xpath,domxpath,Php,Xpath,Domxpath,有没有办法用XPath 1获取两个节点之间的文本 示例:我们希望得到F和D之间的文本,预期结果为“G” 最后,函数: public function getNodesBetween($a, $b, $domxpath) { $query = $a."/following::text()[. = ".$b."/preceding::text()]"; $elements = $domxpath->query($query); $inside =
public function getNodesBetween($a, $b, $domxpath) {
$query = $a."/following::text()[. = ".$b."/preceding::text()]";
$elements = $domxpath->query($query);
$inside = '';
foreach ($elements as $element) {
$inside .= $element->nodeValue;
}
dd($inside);
}
如果我试着从A搜索到D,它是有效的,输出是“bcfg”。如果我在F和D之间搜索,它将返回一个空字符串。似乎它正在搜索兄弟姐妹,而F没有兄弟姐妹,所以它停止了。我能找到的唯一答案是XPath 2.0:
“假设您需要两个h3之间的所有树深度的节点
元素,不一定是兄弟”
从
/path/to/first/h3/following::node()[。您正在查找$A/following::node()
与$B/preference::node()的交叉点
在XPath 1.0中,$X和$Y的交集由$X[count(.|$Y)=count($Y)]
给出
这就给了你
$A/following::node()[count(.|$B/preceding::node())=count($B/preceding::node())]
它的性能可能非常差。您使用“between”的方式是按顺序的,这不是XML的工作方式。永远不要使用“=”来比较节点的标识:它会按内容进行比较。这是您建议的查询:$query=$a.“/following::node()[count(.|“$b.”/previous::node())=count(.$b.“/previous::node())=count(.$b.“/previous::node())”;
但它也不起作用。返回一个空字符串。我的错误是,我做了一个错误的变量赋值。它应该是:$a='/html/body/b/c/f';
才有意义。谢谢!
public function getNodesBetween($a, $b, $domxpath) {
$query = $a."/following::text()[. = ".$b."/preceding::text()]";
$elements = $domxpath->query($query);
$inside = '';
foreach ($elements as $element) {
$inside .= $element->nodeValue;
}
dd($inside);
}
/path/to/first/h3/following::node()[. << /path/to/second/h3]
$A/following::node()[count(.|$B/preceding::node())=count($B/preceding::node())]