繁体   English   中英

弄清楚CDATA在lxml元素中的位置?

[英]Figuring out where CDATA is in lxml element?

我需要解析并重建一个解析器使用的文件格式,该解析器说的语言只能被称为XML。 我意识到符合标准的XML并不关心CDATA或空白,但不幸的是,这个应用程序要求我关心两者......

我正在使用lxml.etree因为它非常擅长保留CDATA。

例如:

s = '''
<root>
  <item>
     <![CDATA[whatever]]>
  </item>
</root>'''

import lxml.etree as et
et.fromstring(s, et.XMLParser(strip_cdata=False))
item = root.find('item')
print et.tostring(item)

这打印:

<item>
    <![CDATA[whatever]]>
  </item>

lxml完全保留了<item>标签的格式......太棒了!

问题是我没有办法确切地告诉CDATA在标签的文本中开始和结束的位置。 属性item.text没有说明CDATA包含文本的确切部分:

item.text
 ==> '\n     whatever\n  '

因此,如果我修改它,并尝试将其作为CDATA吐出,那么我将丢失空白的位置:

item.text = CDATA('foobar')
et.tostring(item)
 ==> '<item><![CDATA[foobar]]></item>\n'

显然, lxml “知道”CDATA位于节点文本中的位置,因为它使用node.tostring()保存它。 但是,我无法想出一种方法来反省文本的哪些部分是CDATA,哪些不是。 有什么建议?

我不确定lxml ,但是使用minidom可以更改CDATA部分并保留周围的空白,因为CDATASection是一个单独的节点类型。

>>> from xml.dom import minidom
>>> data = minidom.parseString(s)
>>> parts = data.getElementsByTagName('item')
>>> item = parts[0]
>>> item.childNodes
[<DOM Text node "u'\n     '">, <DOM CDATASection node "u'whatever'">, <DOM Text node "u'\n  '">]
>>> item.childNodes[1].nodeValue = 'changed'
>>> print item.toxml()
<item>
     <![CDATA[changed]]>
  </item>

请参阅xml.dom.minidom:获取CDATA值以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM