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