ฉันอาจแนะนำให้declxml declxml
การเปิดเผยอย่างเต็มรูปแบบ: ฉันเขียนไลบรารีนี้เนื่องจากฉันกำลังมองหาวิธีการแปลงระหว่างโครงสร้างข้อมูล XML และ Python โดยไม่จำเป็นต้องเขียนโค้ดแยกวิเคราะห์บรรทัด / อนุกรมที่จำเป็นหลายสิบบรรทัดด้วย ElementTree
ด้วย declxml คุณใช้ตัวประมวลผลเพื่อกำหนดโครงสร้างของเอกสาร XML ของคุณและวิธีแมประหว่างโครงสร้างข้อมูล XML และ Python ตัวประมวลผลใช้สำหรับทั้งการทำให้เป็นอนุกรมและการแยกวิเคราะห์รวมถึงการตรวจสอบระดับพื้นฐาน
การแยกวิเคราะห์โครงสร้างข้อมูล Python เป็นเรื่องง่าย:
import declxml as xml
xml_string = """
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
"""
processor = xml.dictionary('foo', [
xml.dictionary('bar', [
xml.array(xml.integer('type', attribute='foobar'))
])
])
xml.parse_from_string(processor, xml_string)
ซึ่งผลิตผลลัพธ์:
{'bar': {'foobar': [1, 2]}}
คุณยังสามารถใช้ตัวประมวลผลเดียวกันเพื่อจัดลำดับข้อมูลเป็น XML
data = {'bar': {
'foobar': [7, 3, 21, 16, 11]
}}
xml.serialize_to_string(processor, data, indent=' ')
ซึ่งผลิตผลลัพธ์ต่อไปนี้
<?xml version="1.0" ?>
<foo>
<bar>
<type foobar="7"/>
<type foobar="3"/>
<type foobar="21"/>
<type foobar="16"/>
<type foobar="11"/>
</bar>
</foo>
หากคุณต้องการทำงานกับวัตถุแทนพจนานุกรมคุณสามารถกำหนดตัวประมวลผลเพื่อแปลงข้อมูลเป็นและจากวัตถุได้เช่นกัน
import declxml as xml
class Bar:
def __init__(self):
self.foobars = []
def __repr__(self):
return 'Bar(foobars={})'.format(self.foobars)
xml_string = """
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
"""
processor = xml.dictionary('foo', [
xml.user_object('bar', Bar, [
xml.array(xml.integer('type', attribute='foobar'), alias='foobars')
])
])
xml.parse_from_string(processor, xml_string)
ซึ่งผลิตผลลัพธ์ต่อไปนี้
{'bar': Bar(foobars=[1, 2])}