Làm cách nào để chuyển đổi ElementTree.Elementsang Chuỗi?
Đối với Python 3:
xml_str = ElementTree.tostring(xml, encoding='unicode')
Đối với Python 2:
xml_str = ElementTree.tostring(xml, encoding='utf-8')
Để tương thích với cả Python 2 & 3:
xml_str = ElementTree.tostring(xml).decode()
Ví dụ sử dụng
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
Đầu ra:
<Person Name="John" />
Giải trình
Bất chấp tên của nó, ElementTree.tostring()trả về một bytestring theo mặc định trong Python 2 & 3. Đây là một vấn đề trong Python 3, sử dụng Unicode cho chuỗi .
Trong Python 2, bạn có thể sử dụng strkiểu cho cả dữ liệu văn bản và dữ liệu nhị phân . Thật không may, sự kết hợp của hai khái niệm khác nhau này có thể dẫn đến mã giòn, đôi khi hoạt động với một trong hai loại dữ liệu, đôi khi không. [...]
Để phân biệt giữa dữ liệu văn bản và dữ liệu nhị phân rõ ràng và rõ ràng hơn, [Python 3] đã tạo các kiểu dữ liệu văn bản và dữ liệu nhị phân riêng biệt không thể trộn lẫn với nhau một cách mù quáng .
Nguồn: Chuyển mã Python 2 sang Python 3
Nếu chúng ta biết phiên bản Python nào đang được sử dụng, chúng ta có thể chỉ định mã hóa là unicodehoặc utf-8. Mặt khác, nếu chúng ta cần khả năng tương thích với cả Python 2 & 3, chúng ta có thể sử dụngdecode() để chuyển đổi thành loại chính xác.
Để tham khảo, tôi đã đưa vào so sánh .tostring()kết quả giữa Python 2 và Python 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" />
Cảm ơn Martijn Peters đã chỉ ra rằng strkiểu dữ liệu đã thay đổi giữa Python 2 và 3.
Tại sao không sử dụng str ()?
Trong hầu hết các tình huống, sử dụng str()sẽ là cách " chuẩn tắc " để chuyển đổi một đối tượng thành một chuỗi. Thật không may, việc sử dụng điều này với Elementtrả về vị trí của đối tượng trong bộ nhớ dưới dạng chuỗi lục phân, chứ không phải là biểu diễn chuỗi dữ liệu của đối tượng.
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>
<?xml version='1.0' encoding='utf8'?>tiêu đề. Khi nóutf-8không có tiêu đề. Ngoài ra, nếuetlà một ElementTree, bạn phải vượt quaet.getroot().