परिवर्तित Python ElementTree स्ट्रिंग के लिए


85

जब भी मैं फोन करता हूं ElementTree.tostring(e), मुझे निम्नलिखित त्रुटि संदेश मिलता है:

AttributeError: 'Element' object has no attribute 'getroot'

क्या एलीमेंटट्री ऑब्जेक्ट को एक्सएमएल स्ट्रिंग में बदलने का कोई और तरीका है?

वापस ट्रेस करें:

Traceback (most recent call last):
  File "Development/Python/REObjectSort/REObjectResolver.py", line 145, in <module>
    cm = integrateDataWithCsv(cm, csvm)
  File "Development/Python/REObjectSort/REObjectResolver.py", line 137, in integrateDataWithCsv
    xmlstr = ElementTree.tostring(et.getroot(),encoding='utf8',method='xml')
AttributeError: 'Element' object has no attribute 'getroot'

जवाबों:


107

Elementवस्तुओं की कोई .getroot()विधि नहीं है। उस कॉल को ड्रॉप करें, और .tostring()कॉल काम करता है:

xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')

7
सर्च इंजन से देर से आने वालों के लिए: जब एन्कोडिंग 'utf8' होती है, तो यह <?xml version='1.0' encoding='utf8'?>हेडर को प्रीपेंड करता है । जब यह utf-8हेडर शामिल नहीं है। इसके अलावा अगर etएक ElementTree था, तो आपको पास होना होगा et.getroot()
केंजी नोगुची

24
पायथन 3 में, encoding='utf8'स्ट्रिंग के बजाय बाइटस्ट्रिंग देता है। मैं tostring(xml, encoding="unicode")इसके बजाय का उपयोग करने की सलाह देता हूं
स्टेवोइसाक

2
@StevenVascellaro: XML वास्तव में एक द्विआधारी प्रारूप है , जिसमें डेटा प्रारूप में दिए गए एन्कोडिंग में बाइट्स होते हैं (शीर्ष पर XML घोषणा में निर्दिष्ट, अनुपस्थित होने पर UTF-8 के लिए डिफ़ॉल्ट)। पायथन 2 में, पायथन 3 strके समान वस्तु bytesहै unicode। आउटपुट बाइट्स पूरी तरह से सही है, आउटपुट के रूप में उपयोग करना अनिवार्य रूप से एक अतिरिक्त है जो आपको अपने यूनिकोड स्ट्रिंग की आवश्यकता के बजाय अपने विशिष्ट उपयोग के मामले में डिकोड करने से बचने देता है।
मार्टिन पीटर्स

1
के अनुसार help, केवल encoding="unicode"एक स्ट्रिंग लौटाएगा।
cz

46

मैं ElementTree.Elementस्ट्रिंग में कैसे परिवर्तित करूँ ?

पायथन 3 के लिए:

xml_str = ElementTree.tostring(xml, encoding='unicode')

पायथन 2 के लिए:

xml_str = ElementTree.tostring(xml, encoding='utf-8')

दोनों पायथन 2 और 3 के साथ संगतता के लिए:

xml_str = ElementTree.tostring(xml).decode()

उदाहरण उपयोग

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)

आउटपुट:

<Person Name="John" />

व्याख्या

नाम का तात्पर्य होने के बावजूद, ElementTree.tostring()पायथन 2 और 3 में डिफ़ॉल्ट रूप से एक बाईटस्ट्रिंग देता है। यह पायथन 3 में एक मुद्दा है, जो स्ट्रिंग्स के लिए यूनिकोड का उपयोग करता है

पायथन 2 में आप strटेक्स्ट और बाइनरी डेटा दोनों के लिए टाइप का उपयोग कर सकते हैं । दुर्भाग्य से दो अलग-अलग अवधारणाओं का यह संगम भंगुर कोड हो सकता है जो कभी-कभी किसी भी तरह के डेटा के लिए काम करता है, कभी-कभी नहीं। [...]

पाठ और बाइनरी डेटा के बीच अंतर को स्पष्ट करने और अधिक स्पष्ट करने के लिए, [पायथन 3] ने पाठ और द्विआधारी डेटा को अलग-अलग प्रकार से बनाया है जो नेत्रहीन रूप से एक साथ मिश्रित नहीं हो सकते

स्रोत: पोर्टिंग पायथन 2 कोड टू पायथन 3

यदि हम जानते हैं कि पायथन के किस संस्करण का उपयोग किया जा रहा है, तो हम एन्कोडिंग को unicodeया के रूप में निर्दिष्ट कर सकते हैं utf-8। अन्यथा, यदि हमें पायथन 2 और 3 दोनों के साथ संगतता की आवश्यकता है, तो हम decode()सही प्रकार में परिवर्तित करने के लिए उपयोग कर सकते हैं ।

संदर्भ के लिए, मैंने .tostring()पायथन 2 और पायथन 3 के बीच परिणामों की तुलना शामिल की है ।

ElementTree.tostring(xml)
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />

ElementTree.tostring(xml, encoding='unicode')
# Python 3: <Person Name="John" />
# Python 2: LookupError: unknown encoding: unicode

ElementTree.tostring(xml, encoding='utf-8')
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />

ElementTree.tostring(xml).decode()
# Python 3: <Person Name="John" />
# Python 2: <Person Name="John" />

मार्टिंस पीटर्स को यह इंगित करने के लिए धन्यवाद कि strपायथन 2 और 3 के बीच डेटाटाइप बदल गया।


Str () का उपयोग क्यों नहीं किया जाता है?

अधिकांश परिदृश्यों में, किसी वस्तु को स्ट्रिंग में बदलने के लिए str()" कैनेनिकल " तरीका का उपयोग करना होगा । दुर्भाग्यवश, इसका उपयोग Elementऑब्जेक्ट के डेटा के एक स्ट्रिंग प्रतिनिधित्व के बजाय, हेक्सस्ट्रिंग के रूप में ऑब्जेक्ट के स्थान को रिटर्न में करता है।

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
print(str(xml))  # <Element 'Person' at 0x00497A80>

1
पायथन 2 में ElementTree.tostring()भी एक बाइटस्ट्रिंग उत्पन्न करता है। strप्रकार एक bytestring है अजगर 2 में (अजगर 3 के strप्रकार कहा जाता है unicodeअजगर 2 में)।
मार्टिन पीटर्स

1
उस सुविधा को केवल पायथन 3 संस्करण में जोड़ा गया था, और पायथन 2 को वापस नहीं भेजा गया था। यदि ऐसा था, तो आपको एक unicodeस्ट्रिंग वापस मिल जाएगी ।
मार्टिन पीटर्स

0

गैर-लैटिन उत्तर एक्सटेंशन

@ Stevoisiak के उत्तर और गैर-लैटिन वर्णों से निपटने के लिए विस्तार । केवल एक ही तरीका आपको गैर-लैटिन वर्णों को प्रदर्शित करेगा। एक विधि पायथन 3 और पायथन 2 दोनों पर अलग है।

इनपुट

xml = ElementTree.fromstring('<Person Name="크리스" />')
xml = ElementTree.Element("Person", Name="크리스")  # Read Note about Python 2

नोट: पायथन 2 में, toString(...)कोड को कॉल करते समय , असाइन करने xmlसे ElementTree.Element("Person", Name="크리스")त्रुटि आएगी ...

UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 0: ordinal not in range(128)

उत्पादन

ElementTree.tostring(xml)
# Python 3 (크리스): b'<Person Name="&#53356;&#47532;&#49828;" />'
# Python 3 (John): b'<Person Name="John" />'

# Python 2 (크리스): <Person Name="&#53356;&#47532;&#49828;" />
# Python 2 (John): <Person Name="John" />


ElementTree.tostring(xml, encoding='unicode')
# Python 3 (크리스): <Person Name="크리스" />             <-------- Python 3
# Python 3 (John): <Person Name="John" />

# Python 2 (크리스): LookupError: unknown encoding: unicode
# Python 2 (John): LookupError: unknown encoding: unicode

ElementTree.tostring(xml, encoding='utf-8')
# Python 3 (크리스): b'<Person Name="\xed\x81\xac\xeb\xa6\xac\xec\x8a\xa4" />'
# Python 3 (John): b'<Person Name="John" />'

# Python 2 (크리스): <Person Name="크리스" />             <-------- Python 2
# Python 2 (John): <Person Name="John" />

ElementTree.tostring(xml).decode()
# Python 3 (크리스): <Person Name="&#53356;&#47532;&#49828;" />
# Python 3 (John): <Person Name="John" />

# Python 2 (크리스): <Person Name="&#53356;&#47532;&#49828;" />
# Python 2 (John): <Person Name="John" />

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.