问题
In my xml I have a CDATA
section. I want to keep the CDATA part, and then strip it. Can someone help with the following?
Default does not work:
$ 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 seems to suggest that a parser
option strip_cdata=False
may keep the cdata, but it has no effect:
$ parser=etree.XMLParser(strip_cdata=False)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
Using strip_cdata=True
, which should be the default, yields the same:
$ parser=etree.XMLParser(strip_cdata=True)
$ tree = etree.parse(StringIO(xml), parser=parser)
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船é€ '
回答1:
CDATA sections are not preserved in the text
property of an element, even if strip_cdata=False
is used when the XML content is parsed, as you have noticed. See https://lxml.de/api.html#cdata.
CDATA sections are preserved in these cases:
When serializing with
tostring()
:print(etree.tostring(tree.getroot(), encoding="UTF-8").decode())
When writing to a file:
tree.write("subject.xml", encoding="UTF-8")
来源:https://stackoverflow.com/questions/53453791/lxml-python-reading-xml-with-cdata-section