Python中空XML元素的处理

3 投票
3 回答
7420 浏览
提问于 2025-04-15 13:11

我对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结构中放入的内容)。

3 个回答

1

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序做一些事情,比如计算、显示信息或者处理数据。为了让程序能够理解我们想要它做的事情,我们需要用一种特定的语言来告诉它。这种语言就是编程语言。

编程语言就像是我们和计算机之间的桥梁。通过这种语言,我们可以给计算机下达指令,让它按照我们的要求去工作。每种编程语言都有自己的规则和语法,就像我们说话时需要遵循语法一样。

在学习编程时,很多人会遇到各种各样的问题。这是很正常的,因为编程是一项需要不断练习和探索的技能。遇到问题时,可以通过查阅资料、请教他人或者在网上寻找答案来解决。

总之,编程就像是给计算机下达命令的过程,而学习编程则是掌握这种命令的语言和规则。只要坚持练习,就一定能掌握这项技能!

value = thing.firstChild.nodeValue or ''
1

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

4

打开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))

从这里我们可以推测,短标签的形式只会出现在子节点列表是空的情况下。实际上,这似乎是正确的:

>>> 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规范并没有区分这两种情况。如果你的代码确实做了区分,那就意味着你需要重新考虑一下如何序列化你的数据。

xml.dom.minidom只是因为编码更简单而以不同的方式显示内容。不过,你可以获得一致的输出。只需继承Element类,并重写toxml方法,这样当没有非空文本内容的子节点时,它就会输出短标签形式。然后对模块进行猴子补丁,使用你新的Element类。

撰写回答