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

时间:2015-12-05 21:33:25

标签: python lxml

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

<MemoryEnv></MemoryEnv>

使用

序列化时
etree.tostring(root_element, pretty_print_True)

输出元素已折叠为

<MemoryEnv/>

有什么方法可以阻止这种情况吗? etree.tostring()没有提供这样的便利。

有没有办法干扰lxml&#39; tostring()序列化程序?

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

问题是,虽然空元素的折叠和未折叠形式是等价的,但是 解析此文件的程序不能使用折叠的空元素。

2 个答案:

答案 0 :(得分:3)

这是一种方法。确保所有空元素的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)

输出:

 
<root>
  <MemoryEnv></MemoryEnv>
  <AlsoEmpty></AlsoEmpty>
  <foo>bar</foo>
</root>

另一种方法是使用write_c14n()方法将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")

答案 1 :(得分:1)

使用XML方法(c14n)进行打印并使用lxml,它不会折叠空元素。

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