lxml / python чтение xml с разделом CDATA - PullRequest
0 голосов
/ 24 ноября 2018

В моем 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;€ '

Этот пост , кажется, предполагает, что опция 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 голосов
/ 24 ноября 2018

CDATA-разделы не сохраняются в свойстве text элемента, даже если strip_cdata=False используется, когда вы анализируете содержимое XML, как вы заметили.См. 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")
    
...