Python中的空XML元素处理

2024-05-19 14:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我对minidom解析器处理空元素感到困惑,如下代码部分所示。

import xml.dom.minidom

doc = xml.dom.minidom.parseString('<value></value>')
print doc.firstChild.nodeValue.__repr__()
# Out: None
print doc.firstChild.toxml()
# Out: <value/>

doc = xml.dom.minidom.Document()
v = doc.appendChild(doc.createElement('value'))
v.appendChild(doc.createTextNode(''))
print v.firstChild.nodeValue.__repr__()
# Out: ''
print doc.firstChild.toxml()
# Out: <value></value>

我怎样才能得到一致的行为?我想接收空字符串作为空元素的值(这首先是我放在XML结构中的值)。


Tags: 代码解析器元素docvaluexmloutdom
3条回答

打开xml.dom.minidom并搜索“/>;”,我们发现:

# Method of the Element(Node) class.
def writexml(self, writer, indent="", addindent="", newl=""):
    # [snip]
    if self.childNodes:
        writer.write(">%s"%(newl))
        for node in self.childNodes:
            node.writexml(writer,indent+addindent,addindent,newl)
        writer.write("%s</%s>%s" % (indent,self.tagName,newl))
    else:
        writer.write("/>%s"%(newl))

我们可以由此推断,只有当childNodes是空列表时,才会出现短结束标记形式。事实上,这似乎是真的:

>>> doc = Document()
>>> v = doc.appendChild(doc.createElement('v'))
>>> v.toxml()
'<v/>'
>>> v.childNodes
[]
>>> v.appendChild(doc.createTextNode(''))
<DOM Text node "''">
>>> v.childNodes
[<DOM Text node "''">]
>>> v.toxml()
'<v></v>'

正如Lloyd所指出的,XML规范没有对两者进行区分。如果您的代码确实进行了区分,那意味着您需要重新考虑如何序列化数据。

minidom只是显示了一些不同的东西,因为它更容易编码。但是,您可以获得一致的输出。只需继承Element类并重写toxml方法,以便在没有具有非空文本内容的子节点时打印出短结束标记表单。然后monkeypatch模块使用您的新元素类。

Xml规范没有区分这两种情况。

value = thing.firstChild.nodeValue or ''

相关问题 更多 >