Tôi có thể đề xuất declxml.
Tiết lộ đầy đủ: Tôi đã viết thư viện này vì tôi đang tìm cách chuyển đổi giữa cấu trúc dữ liệu XML và Python mà không cần phải viết hàng tá dòng phân tích cú pháp/tuần tự hóa với ElementTree.
Với declxml, bạn sử dụng bộ xử lý để xác định rõ cấu trúc của tài liệu XML và cách ánh xạ giữa cấu trúc dữ liệu XML và Python. Bộ vi xử lý được sử dụng để cho cả serialization 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 thành những cấu trúc dữ liệu Python là đơ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)
nào tạo ra kết quả:
{'bar': {'foobar': [1, 2]}}
Bạn cũng có thể sử dụng bộ vi xử lý tương tự để serialize dữ liệu XML
data = {'bar': {
'foobar': [7, 3, 21, 16, 11]
}}
xml.serialize_to_string(processor, data, indent=' ')
Sản xuất sản phẩm sau đây
<?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ũng 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)
nào xuất ra như sau
{'bar': Bar(foobars=[1, 2])}
liên quan: [? Python xml ElementTree từ một nguồn chuỗi] (https://stackoverflow.com/q/647071/3357935) –