2012-05-31 16 views
10

में XPath के साथ पाठ द्वारा तत्व का पता लगाएं निम्नलिखित:की तरह एक XML को देखते हुए ElementTree

<root> 
    <element>A</element> 
    <element>B</element> 
</root> 

मैं सामग्री की तत्व से मेल कर सकते हैं एक ElementTree और XPath के लिए अपने समर्थन का उपयोग कर? धन्यवाद

उत्तर

29

AFAIK ElementTree XPath का समर्थन नहीं करता है। क्या यह बदल गया है?

वैसे भी, आप lxml और निम्नलिखित XPath अभिव्यक्ति का उपयोग कर सकते हैं:

import lxml.etree 
doc = lxml.etree.parse('t.xml') 
print doc.xpath('//element[text()="A"]')[0].text 
print doc.xpath('//element[text()="A"]')[0].tag 

परिणाम होगा:

A 
element 
9

आप बल्कि lxml से, मानक पुस्तकालय ElementTree का उपयोग करना चाहते हैं, तो आप एक विशेष पाठ मूल्य के साथ सभी उप तत्वों को खोजने के लिए पुनरावृत्ति का उपयोग कर सकते हैं। उदाहरण के लिए:

import sys 
import xml.etree.ElementTree as etree 

s = """<root> 
    <element>A</element> 
    <element>B</element> 
</root>""" 

e = etree.fromstring(s) 

if sys.version_info < (2, 7): 
    found = [element for element in e.getiterator() if element.text == 'A'] 
else: 
    found = [element for element in e.iter() if element.text == 'A'] 

print found[0].text # This prints 'A', honestly! 

नोट: यदि आप सूची समझ में अपने तत्वों की text मूल्य के कुछ अलग करना चाहता है।

संपादित करें यह आपके एक्सएमएल पेड़ में किसी भी गहराई पर काम करेगा। उदाहरण के लिए,

s = """<root> 
    <element>A</element> 
    <element><sub>A</sub></element> 
</root>""" 

found = [element for element in e.getiterator() if element.text == 'A'] 

for f in found: 
    print f 

<Element element at 7f20a882e3f8> 
<Element sub at 7f20a882e4d0> 
+1

मैंने अपने कार्य के लिए cElementTree पर lxml का उपयोग करना चुना है क्योंकि इसमें बहुत कम मेमोरी ओवरहेड है (स्मृति CPU उपयोग से अधिक महत्वपूर्ण है), यह कोड का अंतिम बिट था जिसे मुझे lxml – Patrick

0

प्रिंट आप XPath in ElementTree उपयोग कर सकते हैं होगा। किसी भी lib स्थापित करने के लिए आवश्यक नहीं है।

config.findall('.//*[element="A"]/element') 

@Bionicegenius से टिप्पणी bellow बताते हैं, बस ऊपर अभिव्यक्ति काम करता है अगर आपके तत्व कोई भाई हैं, लेकिन आप तत्व पेड़ में xpath का उपयोग करने का विचार मिलता है।

+0

से स्थानांतरित करने की आवश्यकता थी, इसमें कोई समस्या है वांछित नोड के समान स्तर पर सभी तत्वों का चयन करने के लिए। यह मूल्य ए और बी के साथ दोनों तत्व पाएंगे यदि आप इसे खोजने के लिए संशोधित करते हैं, तो यह केवल ए के मान के साथ तत्व पाएगा, भले ही आप बी की खोज करें - यह केवल पहले बच्चे को वापस कर देगा। – Bioniclegenius

संबंधित मुद्दे