Làm cách nào để chuyển đổi ElementTree.Element
sang 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 str
kiể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à unicode
hoặ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 str
kiể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 Element
trả 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-8
không có tiêu đề. Ngoài ra, nếuet
là một ElementTree, bạn phải vượt quaet.getroot()
.