簡體   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