2014-05-21 12 views
6

तय करने के लिए जो अपने प्रयोग के मामले के लिए अधिक उपयुक्त है की कोशिश कर रहा ...DOMXPath :: मूल्यांकन और DOMXPath :: क्वेरी के बीच क्या अंतर है?

इन तरीकों के लिए दस्तावेज़ की तुलना के बाद, मेरे अस्पष्ट समझ evaluate रिटर्न एक टाइप किया परिणाम है, लेकिन query नहीं करता है। इसके अलावा, query उदाहरण में कई परिणामों के माध्यम से लूपिंग शामिल है लेकिन evaluate उदाहरण एक टाइप किए गए परिणाम को मानता है।

अभी भी ज्यादा बुद्धिमान नहीं है! जब आप एक या दूसरे का उपयोग करेंगे तो कोई भी समझा सकता है (जितना संभव हो सके आम आदमी के नियमों के लिए) - उदा। ऊपर वर्णित एकाधिक/एकल परिणाम हमेशा मामले होंगे?

उत्तर

7

DOMXPath :: क्वेरी() केवल भाव है कि एक नोड सूची वापसी का समर्थन करता है। DOMXPath :: मूल्यांकन() सभी वैध अभिव्यक्तियों का समर्थन करता है। आधिकारिक विधि का नाम है का मूल्यांकन(), भी: http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator

एक div के अंदर सभी p तत्वों का चयन करें: //a/@href

आप string() उपयोग कर सकते हैं: //div//p

वर्तमान दस्तावेज़ a तत्वों में सभी href गुण का चयन करें एक स्ट्रिंग में नोड सूची के पहले तत्व को कास्ट करने के लिए कार्य करें। यह DOMXpath :: क्वेरी() के साथ काम नहीं करेगा। string(/html/head/title)

अन्य समारोह और ऑपरेटरों कि एक अभिव्यक्ति का परिणाम प्रकार बदल जाएगा रहे हैं:

एक दस्तावेज़ का शीर्षक पाठ का चयन करें। लेकिन यह हमेशा स्पष्ट नहीं है। आप हमेशा जानते होंगे कि परिणाम किस प्रकार है।

4

query आपकी वास्तविक XPath अभिव्यक्ति के बावजूद DOMNodeList वापस करेगा। इससे पता चलता है कि आप नहीं जानते कि परिणाम क्या हो सकता है। तो आप सूची में पुन: प्रयास कर सकते हैं और नोड्स के node type जांच सकते हैं और प्रकार के आधार पर कुछ कर सकते हैं।

लेकिन 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 के समान उत्पादन का उत्पादन करेगा।

ThW's answer सही है कि कुछ भाव query साथ काम नहीं करेंगे है:

$xpath->query("string(//div/@id)") // DOMNodeList of length 0 
$xpath->evaluate("string(//div/@id)") // string with the found id 
संबंधित मुद्दे