Tôi không biết liệu các phiên bản trước của mã đề nghị làm việc rất tốt và liệu ElementTree mô-đun đã được cập nhật nhưng Tôi đã gặp sự cố khi sử dụng mẹo này:
etree._original_serialize_xml = etree._serialize_xml
def _serialize_xml(write, elem, qnames, namespaces):
if elem.tag == '![CDATA[':
write("\n<%s%s]]>\n" % (
elem.tag, elem.text))
return
return etree._original_serialize_xml(
write, elem, qnames, namespaces)
etree._serialize_xml = etree._serialize['xml'] = _serialize_xml
Vấn đề với cách tiếp cận này là sau khi vượt qua ngoại lệ này, bộ nối tiếp lại coi nó là thẻ bình thường sau đó S. Tôi đã nhận được một cái gì đó như:
<textContent>
<![CDATA[this was the code I wanted to put inside of CDATA]]>
<![CDATA[>this was the code I wanted to put inside of CDATA</![CDATA[>
</textContent>
Và tất nhiên chúng tôi biết rằng sẽ chỉ gây ra nhiều lỗi. Tại sao điều đó xảy ra?
Câu trả lời là ở anh chàng này ít:
return etree._original_serialize_xml(write, elem, qnames, namespaces)
Chúng tôi không muốn để kiểm tra mã một lần nữa thông qua chức năng tự các gốc nếu chúng tôi đã bị mắc kẹt CDATA của chúng tôi và thành công thông qua nó thông qua. Vì vậy, trong khối "if", chúng ta phải trả về hàm serialize ban đầu chỉ khi CDATA không có ở đó. Chúng tôi đã bỏ lỡ "else" trước khi trở về chức năng ban đầu.
Hơn nữa trong mô-đun ElementTree phiên bản của tôi, chức năng tuần tự hóa đã tuyệt vọng yêu cầu đối số "short_empty_element". Vì vậy, các phiên bản gần đây nhất mà tôi muốn giới thiệu vẻ như thế này (cũng với "đuôi"):
from xml.etree import ElementTree
from xml import etree
#in order to test it you have to create testing.xml file in the folder with the script
xmlParsedWithET = ElementTree.parse("testing.xml")
root = xmlParsedWithET.getroot()
def CDATA(text=None):
element = ElementTree.Element('![CDATA[')
element.text = text
return element
ElementTree._original_serialize_xml = ElementTree._serialize_xml
def _serialize_xml(write, elem, qnames, namespaces,short_empty_elements, **kwargs):
if elem.tag == '![CDATA[':
write("\n<{}{}]]>\n".format(elem.tag, elem.text))
if elem.tail:
write(_escape_cdata(elem.tail))
else:
return ElementTree._original_serialize_xml(write, elem, qnames, namespaces,short_empty_elements, **kwargs)
ElementTree._serialize_xml = ElementTree._serialize['xml'] = _serialize_xml
text = """
<?xml version='1.0' encoding='utf-8'?>
<text>
This is just some sample text.
</text>
"""
e = ElementTree.Element("data")
cdata = CDATA(text)
root.append(cdata)
#tests
print(root)
print(root.getchildren()[0])
print(root.getchildren()[0].text + "\n\nyay!")
Kết quả tôi nhận được:
<Element 'Database' at 0x10062e228>
<Element '![CDATA[' at 0x1021cc9a8>
<?xml version='1.0' encoding='utf-8'?>
<text>
This is just some sample text.
</text>
yay!
Chúc các bạn kết quả tương tự!
> Tôi cần xuất XML có chứa phần CDATA Tại sao? Có vẻ như một yêu cầu kỳ lạ. – bortzmeyer
Đó là một yêu cầu mà tôi có - các đoạn CDATA đôi khi dễ đọc hơn nhiều. – grifaton
@bortzmeyer Thật hữu ích khi thêm HTML vào KML (tệp XML của Google Maps). –