2011-12-20 5 views
19

मेरे पास एक स्ट्रिंग है जिसमें XML अनुरोध है जो http अनुरोध से लौटाया गया है।पायथन एलिमेंट ट्री: एक स्ट्रिंग को पार्स करना और एलिमेंट ट्री इंस्टेंस प्राप्त करना

मैं डेटा को पार्स करने के लिए ElementTree का उपयोग कर रहा हूं, और फिर मैं तत्व के लिए रिकर्सिव खोजना चाहता हूं।

this question के अनुसार, मैं केवल रिकर्सिवली result.findall() साथ खोज सकते हैं अगर result प्रकार ElementTree की है बजाय टाइप Element

अब xml.etree.ElementTree.fromstring(), स्ट्रिंग पार्स करने में इस्तेमाल किया, एक Element वस्तु देता है, जबकि xml.etree.ElementTree.parse(), एक फ़ाइल पार्स करने के लिए प्रयोग किया जाता है, एक ElementTree वस्तु देता है।

मेरा प्रश्न तब है: मैं स्ट्रिंग को पार्स कैसे कर सकता हूं और ElementTree उदाहरण प्राप्त कर सकता हूं? (एक अस्थायी फ़ाइल के लिए लिख जैसे किसी भी पागलपन के बिना)

उत्तर

25

जब आप ElementTree.fromstring() का उपयोग क्या तुम वापस हो रही है, मूल रूप से पेड़ की जड़ है, इसलिए यदि आप इस ElementTree.ElementTree(root) की तरह एक नया पेड़ बनाते हैं तो आप आप मिल जाएगा ' फिर से देख रहे हैं

इसलिए, यह स्पष्ट करने के:

from xml.etree import ElementTree 
tree = ElementTree.ElementTree(ElementTree.fromstring(<your_xml_string>)) 

या:

from xml.etree.ElementTree import fromstring, ElementTree 
tree = ElementTree(fromstring(<your_xml_string>)) 
+0

मैं बस चाहता हूँ जोड़ें - एलएक्सएमएल का उपयोग करने वालों के लिए - जो कि एलएक्सएमएल में (जहां एक तत्व हमेशा दस्तावेज़/पेड़ से संबंधित होता है, भले ही अंतर्निहित हो), आप getrootttree() विधि का उपयोग कर सकते हैं। – Steven

+0

धन्यवाद! इट्री में वास्तव में कष्टप्रद एपीआई डिज़ाइन, इनपुट स्रोत के आधार पर विभिन्न प्रकार के आउटपुट के लिए। वास्तव में भ्रमित :( –

+0

यह वास्तव में प्रलेखन में बहुत स्पष्ट नहीं है। "सेस्ट्रिंग() एक स्ट्रिंग से एक्सएमएल को सीधे एलीमेंट में पार्स करता है, जो पार्स किए गए पेड़ का मूल तत्व है। अन्य पार्सिंग फ़ंक्शन एलिमेंट ट्री बना सकते हैं।" – Snorfalorpagus

6

एक फ़ाइल की तरह वस्तु में अपने स्ट्रिंग मुड़ें और का उपयोग ElementTree.parse:

from xml.etree import ElementTree 
from cStringIO import StringIO 

tree = ElementTree.parse(StringIO(string)) 
+0

बढ़िया, यह वह है जिसे मैं ढूंढ रहा था। :-) –