繁体   English   中英

PHP DomXPath不选择空文本节点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM