lxml/python 使用 CDATA 部分阅读 xml
lxml/python reading xml with CDATA section
在我的 xml 中有一个 CDATA
部分。我想保留 CDATA 部分,然后将其剥离。有人可以帮忙解决以下问题吗?
默认不起作用:
$ from io import StringIO
$ from lxml import etree
$ xml = '<Subject> My Subject: 美海軍研究船勘查台海水文? 船<![CDATA[é]]>€ </Subject>'
$ tree = etree.parse(StringIO(xml))
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
This post 似乎暗示 parser
选项 strip_cdata=False
可能会保留 cdata,但没有效果:
$ parser=etree.XMLParser(strip_cdata=False)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
使用 strip_cdata=True
,这应该是默认的,产生相同的结果:
$ parser=etree.XMLParser(strip_cdata=True)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
CDATA 部分不会保留在元素的 text
属性 中,即使在解析 XML 内容时使用 strip_cdata=False
也是如此,正如您所注意到的.参见 https://lxml.de/api.html#cdata。
CDATA 节 在这些情况下保留:
用tostring()
序列化时:
print(etree.tostring(tree.getroot(), encoding="UTF-8").decode())
写入文件时:
tree.write("subject.xml", encoding="UTF-8")
在我的 xml 中有一个 CDATA
部分。我想保留 CDATA 部分,然后将其剥离。有人可以帮忙解决以下问题吗?
默认不起作用:
$ from io import StringIO
$ from lxml import etree
$ xml = '<Subject> My Subject: 美海軍研究船勘查台海水文? 船<![CDATA[é]]>€ </Subject>'
$ tree = etree.parse(StringIO(xml))
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
This post 似乎暗示 parser
选项 strip_cdata=False
可能会保留 cdata,但没有效果:
$ parser=etree.XMLParser(strip_cdata=False)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
使用 strip_cdata=True
,这应该是默认的,产生相同的结果:
$ parser=etree.XMLParser(strip_cdata=True)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
CDATA 部分不会保留在元素的 text
属性 中,即使在解析 XML 内容时使用 strip_cdata=False
也是如此,正如您所注意到的.参见 https://lxml.de/api.html#cdata。
CDATA 节 在这些情况下保留:
用
tostring()
序列化时:print(etree.tostring(tree.getroot(), encoding="UTF-8").decode())
写入文件时:
tree.write("subject.xml", encoding="UTF-8")