[英]PHP DomXPath not selecting empty text nodes
我正在尝试选择不包含任何文本的节点。 这段PHP代码跳过了示例xml中的空节点。 但是,当我尝试使用在线测试仪(例如http://freeformatter.com/xpath-tester.html )时,它没有任何问题。
这是PHP的东西吗?
我的PHP代码:
$path = "//RecipeSteps/RecipeStep[not(text())]";
$stepsQuery = $this->xpath->query($path);
$numResults = $stepsQuery->length;
我的示例xml:
<?xml version="1.0" encoding="utf-8"?>
<Recipes>
<RecipeSteps>
<RecipeStep number="1">Dummy content</RecipeStep>
<RecipeStep number="2">Dummy content</RecipeStep>
<RecipeStep number="3">Dummy content</RecipeStep>
<RecipeStep number="4">Dummy content</RecipeStep>
<RecipeStep number="5">Dummy content</RecipeStep>
<RecipeStep number="6"></RecipeStep>
<RecipeStep number="7">Variations</RecipeStep>
<RecipeStep number="8">Some variation content..</RecipeStep>
</RecipeSteps>
</Recipes>
如果您正在寻找XPATH解决方案,请使用//RecipeSteps/(RecipeStep[string-length() = 0])
。 例如
$path = "//RecipeSteps/(RecipeStep[string-length() = 0])";
$stepsQuery = $this->xpath->query($path);
$numResults = $stepsQuery->length;
选择完整路径时,它可以工作:
$xmlString = '<?xml version="1.0" encoding="utf-8"?>
<Recipes>
<RecipeSteps>
<RecipeStep number="1">Dummy content</RecipeStep>
<RecipeStep number="2">Dummy content</RecipeStep>
<RecipeStep number="3">Dummy content</RecipeStep>
<RecipeStep number="4">Dummy content</RecipeStep>
<RecipeStep number="5">Dummy content</RecipeStep>
<RecipeStep number="6"></RecipeStep>
<RecipeStep number="7">Variations</RecipeStep>
<RecipeStep number="8">Some variation content..</RecipeStep>
</RecipeSteps>
</Recipes>';
$dom = new DOMDocument();
$dom->loadXML($xmlString);
$xpath = new DOMXpath($dom);
# it works also well: //RecipeSteps/RecipeStep[not(text())]
$query = $xpath->query('//Recipes/RecipeSteps/RecipeStep[not(text())]');
//returns "6"
print 'RecipeStep number: ' . $query->item(0)->getAttribute('number');
同样,选择“ //RecipeSteps/RecipeStep[not(text())]
”也可以像//RecipeSteps/RecipeStep[not(text())]
一样工作。 因此,很可能您在做错事。
路径表达式//RecipeStep[not(text())]
和//RecipeStep[string-length() = 0]
并不相同,但是将您显示的文档作为输入,它们返回的结果完全相同 。 在这两种情况下,都将选择一个RecipeStep
节点作为结果:
<RecipeStep number="6"/>
//RecipeStep[not(text())]
意思是普通的:
仅在文档中没有直接子文本节点的情况下,才选择称为
RecipeStep
元素节点。
另一方面, //RecipeStep[string-length() = 0]
表示
仅在其字符串值的长度(所有后代文本节点的串联)等于0的情况下,在文档中的任何位置选择名为
RecipeStep
元素节点。
仅当配方步骤6实际上看起来像这样时,差异才会明显
<RecipeStep number="6"><child>text</child></RecipeStep>
然后, //RecipeStep[not(text())]
仍将选择此节点,而//RecipeStep[string-length() = 0]
将不返回任何内容。
(为了清楚//RecipeSteps
:我省略的前导//RecipeSteps
不会改变任何内容。)
因此,您原始的XPath表达式是正确的-接受的答案与原始表达式完全相同。 XPath ist没错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.