[英]What is the difference between DOMXPath::evaluate and DOMXPath::query?
DOMXPath :: query()僅支持返回節點列表的表達式。 DOMXPath :: evaluate()支持所有有效表達式。 官方方法也命名為evaluate(): http : //www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
選擇div
: //div//p
所有p
元素
選擇所有href
的屬性, a
元素在當前文檔: //a/@href
您可以使用string()
函數將節點列表的第一個元素強制轉換為字符串。 這不適用於DOMXpath :: query()。
選擇文檔的標題文本: string(/html/head/title)
還有其他函數和運算符將更改表達式的結果類型。 但它總是毫不含糊。 您將始終知道結果的類型。
無論您的實際XPath表達式如何, query
都將返回DOMNodeList
。 這表明您不知道結果可能是什么。 因此,您可以迭代列表並檢查節點的節點類型 ,並根據類型執行某些操作。
但query
不僅限於此用例。 當你知道你會得到什么類型時,你仍然可以使用它。 它將來可能更具可讀性,因此更易於維護。
另一方面, evaluate
為您提供您選擇的類型。 如例子所示:
$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); // "false"
事實證明選擇屬性//div/@id
或文本節點//div/text()
仍會產生DOMNodeList
而不是字符串。 因此潛在的使用案例是有限的。 您必須將它們括在string
: string(//div/@id)
或文本節點string(//div/text())
。
evaluate
的主要優點是,您可以使用較少的代碼行從DOMDocument
獲取字符串。 否則它將產生與query
相同的輸出。
我的答案是正確的,有些表達式不適用於query
:
$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.