পাইথন এলিমেট্রি স্ট্রিতে রূপান্তর করুন


86

আমি যখনই কল করি তখন আমি 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'

উত্তর:


112

Elementবস্তুর কোন .getroot()পদ্ধতি নেই। সেই কলটি ফেলে দিন এবং .tostring()কলটি কাজ করে:

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

আপনার .getroot()যদি কেবল একটি ElementTreeউদাহরণ থাকে তবে আপনাকে ব্যবহার করতে হবে ।

অন্যান্য নোট:

  • এটি একটি বাইস্টেরিং উত্পাদন করে যা পাইথন 3 এ bytesটাইপ is
    আপনার যদি অবশ্যই কোনও strবস্তু থাকে তবে আপনার কাছে দুটি বিকল্প রয়েছে:

    1. ইউটিএফ -8 থেকে ফলস্বরূপ বাইটস মানটি ডিকোড করুন: xmlstr.decode("utf8")

    2. ব্যবহার encoding='unicode'; এটি একটি এনকোড / ডিকোড চক্র এড়িয়ে চলে:

      xmlstr = ElementTree.tostring(et, encoding='unicode', method='xml')
      
  • আপনি যদি ইউটিএফ -8 এনকোডড বাইস্টেরিং মানটি দেখতে চান বা পাইথন 2 ব্যবহার করছেন তবে বিবেচনা করুন যে এলিমেন্টটি সঠিকভাবে utf8স্ট্যান্ডার্ড এক্সএমএল এনকোডিং হিসাবে সনাক্ত করে না , তাই এটি একটি <?xml version='1.0' encoding='utf8'?>ঘোষণা যুক্ত করবে। আপনি যদি এটি প্রতিরোধ করতে চান তবে ব্যবহার করুন utf-8বা UTF-8(কোনও ড্যাশ সহ)। encoding="unicode"কোনও ঘোষণার শিরোনাম ব্যবহার করার সময় যুক্ত করা হয়।


47

আমি কীভাবে 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 ডিফল্টরূপে একটি bytestring ফেরৎ এই পাইথন 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" />

পাইথন 2 এবং 3 এর মধ্যে ডেটাটাইপ পরিবর্তিত হয়েছে তা নির্দেশ করার জন্য মার্টিজন পিটার্সকে ধন্যবাদ str


কেন str () ব্যবহার করবেন না?

বেশিরভাগ পরিস্থিতিতে, কোনও বিষয়টিকে স্ট্রিংয়ে রূপান্তর করার str()জন্য " কামানিকাল " উপায়টি ব্যবহার করা হত । দুর্ভাগ্যক্রমে, এর সাহায্যে এটি ব্যবহার Elementকরে অবজেক্টের ডেটার স্ট্রিং উপস্থাপনার পরিবর্তে মেমরিটিতে হেক্সস্ট্রিং হিসাবে বস্তুর অবস্থান ফিরে আসে।

from xml.etree import ElementTree

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

4
পাইথন 2 ElementTree.tostring()এ একটি বাইস্টেরিংও উত্পন্ন করে। strটাইপ একটি bytestring হয় পাইথন 2 (পাইথন 3 এর strটাইপ বলা হয় unicodeপাইথন 2)।
মার্টিজন পিটারস

4
এই বৈশিষ্ট্যটি কেবল পাইথন 3 সংস্করণে যুক্ত করা হয়েছিল এবং পাইথন 2-এ ব্যাকপোর্ট করা হয়নি it এটি যদি হয় তবে আপনি একটি unicodeস্ট্রিং ফিরে পাবেন।
মার্টিজন পিটারস

1

অ-ল্যাটিন উত্তর এক্সটেনশন

থেকে এক্সটেনশন @ 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" />


4
অ-লাতিন অক্ষরগুলির জন্য ভাল কল আউট। আমি উল্লেখ করতে আমার পোস্ট আপডেট করেছি।
স্টিভয়েসিয়াক

0

এক্সএমএল দেখতে কেমন তা দেখতে যদি আপনার কেবল ডিবাগিংয়ের জন্য এটির প্রয়োজন হয় তবে তার পরিবর্তে print(xml.etree.ElementTree.tostring(e))আপনি এটি ব্যবহার করতে পারেন dump:

xml.etree.ElementTree.dump(e)

এবং এটি উভয় হিসাবে Elementএবং ElementTreeঅবজেক্টগুলির সাথে কাজ করে e, তাই কোনও প্রয়োজন নেই getroot

এর ডকুমেন্টেশনdump বলেছেন:

xml.etree.ElementTree.dump(elem)

একটি উপাদান গাছ বা উপাদান কাঠামো লিখুন sys.stdout। এই ফাংশনটি শুধুমাত্র ডিবাগিংয়ের জন্য ব্যবহার করা উচিত।

সঠিক আউটপুট ফর্ম্যাটটি বাস্তবায়ন নির্ভর। এই সংস্করণে, এটি একটি সাধারণ এক্সএমএল ফাইল হিসাবে লেখা।

elem একটি উপাদান গাছ বা একটি পৃথক উপাদান।

সংস্করণ 3.8 এ পরিবর্তিত হয়েছে : dump()ফাংশনটি এখন ব্যবহারকারী দ্বারা নির্দিষ্ট করা অ্যাট্রিবিউট অর্ডার সংরক্ষণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.