lxml / python使用CDATA部分读取xml

时间:2018-11-23 23:17:15

标签: python python-3.x lxml elementtree cdata

在我的xml中,有一个CDATA部分。我想保留CDATA部分,然后剥离它。有人可以提供以下帮助吗?

默认设置无效:

$ from io import StringIO
$ from lxml import etree
$ xml = '<Subject> My Subject: 美海軍研究船勘查台海水文? 船<![CDATA[&#xE9;]]>€ </Subject>'
$ tree = etree.parse(StringIO(xml))
$ tree.getroot().text
' My Subject: 美海軍研究船勘查台海水文? 船&#xE9;€ '

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: 美海軍研究船勘查台海水文? 船&#xE9;€ '

使用strip_cdata=True(应为默认值)会产生相同的结果:

$ parser=etree.XMLParser(strip_cdata=True)
$ tree = etree.parse(StringIO(xml), parser=parser)    
$ tree.getroot().text    
' My Subject: 美海軍研究船勘查台海水文? 船&#xE9;€ '

1 个答案:

答案 0 :(得分:1)

如您所注意到的,即使解析XML内容时使用了text

CDATA节也不会保留在元素的strip_cdata=False属性中。参见https://lxml.de/api.html#cdata

在以下情况下会保留

CDATA部分

  1. 使用tostring()进行序列化时:

    print(etree.tostring(tree.getroot(), encoding="UTF-8").decode())
    
  2. 写入文件时:

    tree.write("subject.xml", encoding="UTF-8")