Tôi có thể đề nghị decxml .
Tiết lộ đầy đủ: Tôi đã viết thư viện này bởi vì tôi đang tìm cách chuyển đổi giữa các cấu trúc dữ liệu XML và Python mà không cần phải viết hàng chục dòng mã phân tích / tuần tự hóa bắt buộc với ElementTree.
Với Decxml, bạn sử dụng các bộ xử lý để xác định khai báo cấu trúc của tài liệu XML của bạn và cách ánh xạ giữa các cấu trúc dữ liệu XML và Python. Bộ xử lý được sử dụng để cho cả tuần tự hóa và phân tích cú pháp cũng như cho một mức độ xác nhận cơ bản.
Phân tích cú pháp vào cấu trúc dữ liệu Python rất đơn giản:
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)
Mà tạo ra đầu ra:
{'bar': {'foobar': [1, 2]}}
Bạn cũng có thể sử dụng cùng một bộ xử lý để tuần tự hóa dữ liệu thành XML
data = {'bar': {
'foobar': [7, 3, 21, 16, 11]
}}
xml.serialize_to_string(processor, data, indent=' ')
Cái nào tạo ra đầu ra sau
<?xml version="1.0" ?>
<foo>
<bar>
<type foobar="7"/>
<type foobar="3"/>
<type foobar="21"/>
<type foobar="16"/>
<type foobar="11"/>
</bar>
</foo>
Nếu bạn muốn làm việc với các đối tượng thay vì từ điển, bạn có thể xác định bộ xử lý để chuyển đổi dữ liệu đến và từ các đối tượng.
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)
Cái nào tạo ra đầu ra sau
{'bar': Bar(foobars=[1, 2])}