簡體   English   中英

DOMXPath :: evaluate和DOMXPath :: query之間有什么區別?

[英]What is the difference between DOMXPath::evaluate and DOMXPath::query?

試着決定哪個更適合我的用例......

在比較這些方法的文檔之后,我模糊的理解是evaluate返回一個類型化的結果,但query沒有。 此外, query示例包括循環遍歷許多結果,但evaluate示例假定單個類型的結果。

仍然沒有多大的明智! 當你使用其中一個時,任何人都可以解釋(盡可能接近外行人的條款) - 例如,上面提到的多個/單個結果總是如此嗎?

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而不是字符串。 因此潛在的使用案例是有限的。 您必須將它們括在stringstring(//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM