Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何防止lxml在序列化为字符串时自动关闭空元素?_Python_Lxml - Fatal编程技术网

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

Python 如何防止lxml在序列化为字符串时自动关闭空元素?,python,lxml,Python,Lxml,我正在解析一个巨大的xml文件,其中包含许多空元素,例如 <MemoryEnv></MemoryEnv> 输出元素将折叠为 <MemoryEnv/> 有没有办法防止这种情况?etree.tostring()不提供这种功能 有没有办法干扰lxml的tostring()序列化程序 顺便说一句,html模块不工作。它不是为XML设计的,而且 它不会以原始形式创建空元素 问题是,尽管空元素的折叠和未折叠形式是等效的,但 解析此文件的程序无法处理折叠的空元素。以

我正在解析一个巨大的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>'