如何防止lxml在序列化为字符串时自动关闭空元素?

2024-10-01 07:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析一个巨大的xml文件,其中包含许多空元素,比如

<MemoryEnv></MemoryEnv>

序列化时

^{pr2}$

输出元素折叠为

<MemoryEnv/>

有什么办法可以防止这种情况吗?etree.tostring()不提供这种功能。在

有没有办法干扰lxml的tostring()序列化程序?在

顺便说一句,html模块不工作。它不是为XML设计的,而且 它不会以原始形式创建空元素。在

问题是,虽然空元素的折叠和未折叠形式是等效的,但是 解析此文件的程序无法处理折叠的空元素。在


Tags: 文件程序功能元素序列化html情况xml
2条回答

使用XML方法(c14n)进行打印,并且它与lxml一起工作,它不会折叠空元素。在

>>> from lxml import etree
>>> s = "<MemoryEnv></MemoryEnv>"
>>> root_element = etree.XML(s)
>>> etree.tostring(root_element, method="c14n")
b'<MemoryEnv></MemoryEnv>'

这里有一个方法。确保所有空元素的text值不是None。在

示例:

from lxml import etree

XML = """
<root>
  <MemoryEnv></MemoryEnv>
  <AlsoEmpty></AlsoEmpty>
  <foo>bar</foo>
</root>"""

doc = etree.fromstring(XML)

for elem in doc.iter():
    if elem.text == None:
        elem.text = ''

print etree.tostring(doc)

输出:

^{pr2}$

另一种方法是使用^{}方法将canonical XML(不使用特殊的空元素语法)写入文件。在

from lxml import etree

XML = """
<root>
  <MemoryEnv></MemoryEnv>
  <AlsoEmpty></AlsoEmpty>
  <foo>bar</foo>
</root>"""

doc = etree.fromstring(XML)

doc.getroottree().write_c14n("out.xml")

相关问题 更多 >