Đối với công việc nghiêm túc với XML trong Python, hãy sử dụng lxml
Python đi kèm với thư viện tích hợp ElementTree, nhưng lxml mở rộng nó về tốc độ và chức năng (xác thực lược đồ, phân tích cú pháp sax, XPath, nhiều loại trình vòng lặp và nhiều tính năng khác).
Bạn phải cài đặt nó, nhưng ở nhiều nơi, nó đã được coi là một phần của thiết bị tiêu chuẩn (ví dụ: Google AppEngine không cho phép các gói Python dựa trên C, nhưng tạo một ngoại lệ cho lxml, pyyaml và một số gói khác).
Xây dựng tài liệu XML với E-factory (từ lxml)
Câu hỏi của bạn là về việc xây dựng tài liệu XML.
Với lxml, có rất nhiều phương pháp và tôi đã mất một lúc để tìm ra một phương pháp, có vẻ dễ sử dụng và cũng dễ đọc.
Mã mẫu từ tài liệu lxml khi sử dụng E-factory (đơn giản hóa một chút):
E-factory cung cấp một cú pháp đơn giản và nhỏ gọn để tạo XML và HTML:
>>> from lxml.builder import E
>>> html = page = (
... E.html( # create an Element called "html"
... E.head(
... E.title("This is a sample document")
... ),
... E.body(
... E.h1("Hello!"),
... E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
... E.p("This is another paragraph, with a", "\n ",
... E.a("link", href="http://www.python.org"), "."),
... E.p("Here are some reserved characters: <spam&egg>."),
... )
... )
... )
>>> print(etree.tostring(page, pretty_print=True))
<html>
<head>
<title>This is a sample document</title>
</head>
<body>
<h1>Hello!</h1>
<p>This is a paragraph with <b>bold</b> text in it!</p>
<p>This is another paragraph, with a
<a href="http://www.python.org">link</a>.</p>
<p>Here are some reserved characters: <spam&egg>.</p>
</body>
</html>
Tôi đánh giá cao trên E-factory nó sau những điều
Mã đọc gần như tài liệu XML kết quả
Số lượng khả năng đọc.
Cho phép tạo bất kỳ nội dung XML nào
Hỗ trợ những thứ như:
- sử dụng không gian tên
- các nút văn bản bắt đầu và kết thúc trong một phần tử
- chức năng định dạng nội dung thuộc tính (xem func CLASS trong mẫu lxml đầy đủ )
Cho phép các cấu trúc rất dễ đọc với danh sách
ví dụ:
from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)
dẫn đến:
<root>
<record>alfa</record>
<record>beta</record>
<record>gama</record>
</root>
Kết luận
Tôi thực sự khuyên bạn nên đọc hướng dẫn lxml - nó được viết rất tốt và sẽ cho bạn nhiều lý do hơn để sử dụng thư viện mạnh mẽ này.
Nhược điểm duy nhất của lxml là nó phải được biên dịch. Xem câu trả lời SO để biết thêm mẹo về cách cài đặt lxml từ gói định dạng bánh xe trong vòng một phần của giây.