防止lxml创建自闭合标签

9

我有一个(旧)工具,它不支持自闭合标签,比如<STATUS/>。所以,我们需要将XML文件序列化为打开/关闭标签的形式,例如:<STATUS></STATUS>

目前我有:

>>> from lxml import etree

>>> para = """<ERROR>The status is <STATUS></STATUS>.</ERROR>"""
>>> tree = etree.XML(para)
>>> etree.tostring(tree)
'<ERROR>The status is <STATUS/>.</ERROR>'

我该如何在标签未闭合的情况下进行序列化?
<ERROR>The status is <STATUS></STATUS>.</ERROR>

解决方案

以下内容由wildwilhelm提供,如下所示

>>> from lxml import etree

>>> para = """<ERROR>The status is <STATUS></STATUS>.</ERROR>"""
>>> tree = etree.XML(para)
>>> for status_elem in tree.xpath("//STATUS[string() = '']"):
...     status_elem.text = ""
>>> etree.tostring(tree)
'<ERROR>The status is <STATUS></STATUS>.</ERROR>'
2个回答

12
似乎<STATUS>标签被分配了一个Nonetext属性:
>>> tree[0]
<Element STATUS at 0x11708d4d0>
>>> tree[0].text
>>> tree[0].text is None
True
如果您将<STATUS>标签的text属性设置为空字符串,那么您应该可以得到您想要的结果。
>>> tree[0].text = ''
>>> etree.tostring(tree)
'<ERROR>The status is <STATUS></STATUS>.</ERROR>'

有了这个想法,你可以在写出XML之前遍历DOM树并修复text属性。大致如下:

# prevent creation of self-closing tags
for node in tree.iter():
    if node.text is None:
        node.text = ''

有没有一种简单的解决方案,可以将闭合标签与开放标签的缩进保持一致,并放在下一行? - undefined

8
如果你需要将lxml dom转换成字符串格式,且该dom对象是HTML类型的,那么你可以使用:
etree.tostring(html_dom, method='html')

为了避免像 <a /> 这样的自闭合标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接