2010-10-22 13 views
10

एक किताब मैं XML पर पढ़ रहा हूँ कि एक XML फ़ाइल में सभी नोड्स एक विशिष्ट विशेषता है कि चयन करने के लिए, वाक्य विन्यास का उपयोग कहते हैं:XPath अभिव्यक्ति

//*/@_attribute_ 

क्या मैं समझ में नहीं आता है कि तारांकन की आवश्यकता क्यों है। जैसा कि मैं इसे समझता हूं, अभिव्यक्ति // रूट नोड के सभी वंशजों का चयन करती है। तो, // @ lang, उदाहरण के लिए, रूट नोड के सभी वंशजों का चयन करें जिनके पास "लैंग" नामक विशेषता है? मैं यह भी व्याख्या नहीं कर सकता कि उपरोक्त अभिव्यक्ति में तारांकन का अर्थ क्या है (मुझे सामान्य रूप से तारांकन पता है "सभी")। अगर कोई मेरे लिए इसे तोड़ सकता है तो मैं वास्तव में इसकी सराहना करता हूं।

धन्यवाद

+0

अच्छा प्रश्न, +1।@ अलेजैंड्रो के बयान के थोड़ा सुधार के लिए मेरा उत्तर देखें कि आपकी XPath अभिव्यक्ति "गलत" है। @ अलेजैंड्रो का जवाब अपवाद के साथ एक अच्छा है कि इस XPath अभिव्यक्ति में कुछ भी गलत नहीं है। –

उत्तर

14

हाय, एक किताब मैं XML पर पढ़ रहा हूँ कहते हैं एक एक्सएमएल फ़ाइल में सभी नोड्स एक विशिष्ट विशेषता है कि चयन करने के लिए है कि, सिंटैक्स का उपयोग करें:

//*/@attribute

यह गलत है।

/descendant-or-self::node()/child::*/attribute::attribute 

अर्थ: एक नोड के किसी भी तत्व बच्चे की सभी attribute विशेषताओं जड़ दस्तावेज़ या उसके descendats में से एक होने

आप की जरूरत है:

/descendant::*[attribute::attribute] 
यह करने के लिए विस्तार किया जाएगा

या संक्षिप्त रूप

//*[@attribute] 

* के बारे में: formaly नाम परीक्षणनोड प्रकार परीक्षण नहीं है। XPath 1.0 में कोई तत्व प्रकार परीक्षण नहीं है। XPath 2.0 में आपके पास element() है। तो, केवल तत्वों का चयन क्यों करें? अच्छा, यह नहीं है। धुरी के पास http://www.w3.org/TR/xpath/#node-tests:

प्रत्येक अक्ष का मुख्य नोड प्रकार होता है। यदि अक्ष में तत्व हो सकते हैं, तो प्रिंसिपल नोड प्रकार तत्व है; अन्यथा, यह नोड्स का प्रकार है जिसमें धुरी हो सकती है। इस प्रकार,

  • विशेषता अक्ष के लिए, प्रिंसिपल नोड प्रकार विशेषता है।
  • नेमस्पेस धुरी के लिए, प्रिंसिपल नोड प्रकार नामस्थान है।
  • अन्य अक्षों के लिए, प्रिंसिपल नोड प्रकार तत्व है।

इसलिए *, child::*, self::*, descendant::*, आदि तत्वों का चयन करता है, लेकिन @* या attribute::* या namespace::* गुण या गुंजाइश नामस्थान में चयन करता है।

भविष्यवाणी के बारे में ([@attribute] भाग): इस अभिव्यक्ति का मूल्यांकन प्रत्येक चरण के साथ अंतिम चरण द्वारा किया जाता है। यह फ़िल्टरिंग के लिए एक बुलियन मूल्य की अपेक्षा करता है। नोड सेट के लिए बूलियन मान (यह attribute::attribute का परिणाम है) एक खाली नोड सेट के लिए गलत है, और अन्यथा सच है।

+0

@Alejandro। '// */@ x' के साथ * कुछ भी गलत नहीं है, सिवाय इसके कि यह लंबे समय से हो सकता है। स्पष्टीकरण के लिए –

12

इस सवाल का शीर्षक है: एक आम विशेषता के साथ सभी नोड्स के चयन के लिए

XPath अभिव्यक्ति

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

//*[@x] 

उपयोग:

//@x 

सभी नोड्स एक आम विशेषता नामित x (btw, केवल तत्व नोड्स गुण हो सकते हैं), उपयोग है कि पता करने के लिए XML दस्तावेज़ में x नामक सभी विशेषताओं का चयन करने के लिए

। ऐसा करने के लिए शायद यह सबसे छोटी अभिव्यक्ति है।

के साथ गलत कुछ भी नहीं है: सिवाय यह थोड़ा लंबा है कि

//*/@x 

यह के लिए एक आशुलिपि है:

/descendant-or-self::node()/child::*/attribute::x 

और यह भी XML दस्तावेज में सभी x गुण का चयन करता है।

कोई व्यक्ति सोच सकता है कि यह अभिव्यक्ति दस्तावेज़ में शीर्ष तत्व की x विशेषता का चयन नहीं करती है।

/descendant-or-self::node() 

जड़ (/) खुद सहित दस्तावेज़ में हर नोड चयन करता है, यह एक गलत निष्कर्ष है, क्योंकि पहली स्थान कदम है।

इसका मतलब है कि:

/descendant-or-self::node()/child::* 

शीर्ष तत्व (जो एक अच्छी तरह से गठित XML दस्तावेज में रूट नोड की इकलौती संतान है) सहित हर तत्व, चयन करता है।

तो, जब पिछले स्थान कदम /@x अंत में जोड़ा जाता है, यह सब x पहले दो स्थान कदमों से अब तक चयनित सभी नोड्स की विशेषताओं का चयन करेंगे - कि XML में सभी तत्व नोड्स के सभी x गुण है दस्तावेज़।

+2

+1 धन्यवाद। मैं हमेशा आपके उत्तरों को पढ़ने का आनंद लेता हूं। – Garett