擅长:python、mysql、java
<p>打开xml.dom.minidom并搜索“/>;”,我们发现:</p>
<pre><code># 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))
</code></pre>
<p>我们可以由此推断,只有当childNodes是空列表时,才会出现短结束标记形式。事实上,这似乎是真的:</p>
<pre><code>>>> 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>'
</code></pre>
<p>正如Lloyd所指出的,XML规范没有对两者进行区分。如果您的代码<em>确实进行了区分,那意味着您需要重新考虑如何序列化数据。</p>
<p>minidom只是显示了一些不同的东西,因为它更容易编码。但是,您可以获得一致的输出。只需继承<code>Element</code>类并重写<code>toxml</code>方法,以便在没有具有非空文本内容的子节点时打印出短结束标记表单。然后monkeypatch模块使用您的新元素类。</p>