Python 如何防止lxml在序列化为字符串时自动关闭空元素?
我正在解析一个巨大的xml文件,其中包含许多空元素,例如Python 如何防止lxml在序列化为字符串时自动关闭空元素?,python,lxml,Python,Lxml,我正在解析一个巨大的xml文件,其中包含许多空元素,例如 <MemoryEnv></MemoryEnv> 输出元素将折叠为 <MemoryEnv/> 有没有办法防止这种情况?etree.tostring()不提供这种功能 有没有办法干扰lxml的tostring()序列化程序 顺便说一句,html模块不工作。它不是为XML设计的,而且 它不会以原始形式创建空元素 问题是,尽管空元素的折叠和未折叠形式是等效的,但 解析此文件的程序无法处理折叠的空元素。以
<MemoryEnv></MemoryEnv>
输出元素将折叠为
<MemoryEnv/>
有没有办法防止这种情况?etree.tostring()
不提供这种功能
有没有办法干扰lxml的tostring()
序列化程序
顺便说一句,html
模块不工作。它不是为XML设计的,而且
它不会以原始形式创建空元素
问题是,尽管空元素的折叠和未折叠形式是等效的,但
解析此文件的程序无法处理折叠的空元素。以下是一种方法。确保所有空元素的
text
值不是None
>>> from lxml import etree
>>> s = "<MemoryEnv></MemoryEnv>"
>>> root_element = etree.XML(s)
>>> etree.tostring(root_element, method="c14n")
b'<MemoryEnv></MemoryEnv>'
例如:
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)
使用XML方法(c14n)进行打印,并与lxml一起工作,它不会折叠空元素
>>> from lxml import etree
>>> s = "<MemoryEnv></MemoryEnv>"
>>> root_element = etree.XML(s)
>>> etree.tostring(root_element, method="c14n")
b'<MemoryEnv></MemoryEnv>'
来自lxml导入etree的>>
>>>s=“”
>>>根元素=etree.XML
>>>etree.tostring(根元素,方法=“c14n”)
b“
在开始和结束标记之间添加一个空格?我这样做了,但不知怎的,它将所有东西都网格化了。另外,由于限制,迭代整个文档也不是很好。无论如何,我设法使用规范XML方法(c14n)进行打印,它与lxml一起工作,它不会折叠空元素,尽管它不会很好地打印元素树中的任何添加内容“以某种方式将所有内容网格化”。这意味着什么?我尝试向具有“None”文本属性的元素添加空字符串,结果是一个非漂亮打印的xml文件。不知何故,如果我迭代元素树,漂亮的打印就会停止。我并没有检查结果的有效性,因为我需要产生不同的输出。。。(这是一个版本文件)。我不明白pretty print对lxml是如何工作的,正如您所读到的,它对c14n方法部分有效(奇怪吧?),当您说“它对c14n方法部分有效”时,“部分”是什么意思?这还不是您想要的吗?我想“如何防止lxml在序列化为字符串时自动关闭空元素?”这个问题已经得到了回答。我知道这不是你想要的,但是关于漂亮的印刷和做差异的能力的要求在问题中没有明确解释。
>>> from lxml import etree
>>> s = "<MemoryEnv></MemoryEnv>"
>>> root_element = etree.XML(s)
>>> etree.tostring(root_element, method="c14n")
b'<MemoryEnv></MemoryEnv>'