2008-10-21 12 views
36

मैं ElementTree में विशेषता XPath चयनकर्ता का उपयोग कर, जो मैं DocumentationElementTree XPath - विशेषता

यहाँ के अनुसार ऐसा करने में सक्षम होना चाहिए दिक्कत है के आधार पर तत्व का चयन कुछ नमूना कोड

एक्सएमएल

है
<root> 
<target name="1"> 
    <a></a> 
    <b></b> 
</target> 
<target name="2"> 
    <a></a> 
    <b></b> 
</target> 
</root> 

अजगर

def parse(document): 
    root = et.parse(document) 
    for target in root.findall("//target[@name='a']"): 
     print target._children 

मैं निम्नलिखित अपवाद प्राप्त कर रहा:

expected path separator ([) 
+1

ElementTree 1.2.6 का उपयोग करना, विशेषता xpath सुविधाओं 1.3 और उससे आगे में ही उपलब्ध हैं। –

+17

यह क्यों बंद करें? यह मेरे लिए उपयोगी था ... यह शायद ही विषय से दूर है। – daramarak

उत्तर

33

सिंटैक्स जिसे आप उपयोग करने का प्रयास कर रहे हैं ElementTree 1.3 में नया है।

इस तरह के संस्करण को पायथन 2.7 या उससे अधिक के साथ भेज दिया गया है। यदि आपके पास पाइथन 2.6 या उससे कम है तो आपके पास अभी भी ElementTree 1.2.6 या इससे कम है।

3

ऐसा लगता है कि findall केवल एक सबसेट XPath का समर्थन करता है। मेलिंग सूची चर्चा here

10

इस कोड में कई समस्याएं हैं।

  1. पायथन के बिल्डिन एलिमेंटट्री (संक्षिप्त के लिए ईटी) में कोई वास्तविक XPATH समर्थन नहीं है; केवल एक सीमित सबसेट उदाहरण के लिए, यह खोज-से-रूट//target जैसे अभिव्यक्तियों का समर्थन नहीं करता है।

    नोटिस: documentation का उल्लेख है "//", लेकिन केवल बच्चों के लिए: तो अभिव्यक्ति के रूप में .//target वैध है; //... नहीं है!

    एक वैकल्पिक कार्यान्वयन है: lxml जो अधिक समृद्ध है। यह सीम है कि बिल्ड-इन कोड के लिए प्रलेखन का उपयोग किया जाता है। वह मेल नहीं खाता/काम करता है।

  2. @name नोटेशन xml- विशेषताएँ का चयन करता है; एक xml-tag के भीतर key=value अभिव्यक्ति।

    ताकि दिए गए दस्तावेज़ में कुछ चुनने के लिए नाम-मान 1 या 2 होना चाहिए। या, कोई बच्चे तत्व'ए': target[a] (नहीं @) के साथ लक्ष्यों की खोज कर सकता है।

दिए गए दस्तावेज़ के लिए, बिल्ड-इन एलिमेंटट्री (v1।3) जड़ के लिए, निम्न कोड सही और काम कर रहे है:

  • root.findall(".//target") दोनों लक्ष्यों
  • root.findall(".//target/a") खोजें खोजें दो एक-तत्व
  • root.findall(".//target[a]") यह फिर दोनों लक्ष्य तत्व पाता है, के रूप में दोनों एक एक करने के लिए है तत्व
  • root.findall(".//target[@name='1']") केवल पहले लक्ष्य का पता लगाएं। ध्यान दें कि 1 के आसपास उद्धरण की आवश्यकता है; अन्यथा एक सिंटेक्स त्रुटि बढ़ी है
  • root.findall(".//target[a][@name='1']") भी मान्य; कि लक्ष्य
  • root.findall(".//target[@name='1']/a") केवल एक एक तत्व ढूँढता है पता लगाने के लिए; ...
संबंधित मुद्दे