我正在解析一个包含许多空元素的巨大xml文件,例如
<MemoryEnv></MemoryEnv>
使用
序列化时etree.tostring(root_element, pretty_print_True)
输出元素已折叠为
<MemoryEnv/>
有什么方法可以阻止这种情况吗? etree.tostring()
没有提供这样的便利。
有没有办法干扰lxml&#39; tostring()
序列化程序?
顺便说一句,html
模块不起作用。它不是为XML而设计的
它不会以原始形式创建空元素。
问题是,虽然空元素的折叠和未折叠形式是等价的,但是 解析此文件的程序不能使用折叠的空元素。
答案 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>'