我需要解析并重建解析器使用的文件格式,解析器使用一种只能慈善地描述为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,但是可以通过最小化更改CDATA节并保留周围的空格,因为CDATASections是单独的节点类型.
>>> 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: Getting CDATA values.
标签:cdata,lxml,xml,python 来源: https://codeday.me/bug/20191121/2051524.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。