Python xmltodict:如何保留 XML 元素顺序?
Python xmltodict: How to preserve XML element order?
我正在为 XML parsing/unparsing 使用 xmltodict,我需要在处理一个文档时保留 XML 元素顺序。玩具 REPL 示例:
>>> import xmltodict
>>> xml = """
... <root>
... <a />
... <b />
... <a />
... </root>
... """
>>> xmltodict.parse(xml)
OrderedDict([('root', OrderedDict([('a', [None, None]), ('b', None)]))])
>>> xmltodict.unparse(_)
'<?xml version="1.0" encoding="utf-8"?>\n<root><a></a><a></a><b></b></root>'
注意原来的序列[a, b, a]
被[a, a, b]
代替了。有什么方法可以保留 xmltodict
的原始顺序?
它不是很优雅,但 minidom 可以很好地完成这项工作:
import xml.dom.minidom as minidom
xml = """
<root>
<a />
<b />
<a />
</root>
"""
doc = minidom.parseString(xml) # or minidom.parse(filename)
root = doc.getElementsByTagName('root')[0] # or doc.documentElement
items = [n for n in root.childNodes if n.nodeType == doc.ELEMENT_NODE]
for item in items:
print item.nodeName
您当然可以使用 full-blown DOM API 之类的 lxml,但对于按文档顺序迭代某些节点的适度任务,可能没有必要。
我正在为 XML parsing/unparsing 使用 xmltodict,我需要在处理一个文档时保留 XML 元素顺序。玩具 REPL 示例:
>>> import xmltodict
>>> xml = """
... <root>
... <a />
... <b />
... <a />
... </root>
... """
>>> xmltodict.parse(xml)
OrderedDict([('root', OrderedDict([('a', [None, None]), ('b', None)]))])
>>> xmltodict.unparse(_)
'<?xml version="1.0" encoding="utf-8"?>\n<root><a></a><a></a><b></b></root>'
注意原来的序列[a, b, a]
被[a, a, b]
代替了。有什么方法可以保留 xmltodict
的原始顺序?
它不是很优雅,但 minidom 可以很好地完成这项工作:
import xml.dom.minidom as minidom
xml = """
<root>
<a />
<b />
<a />
</root>
"""
doc = minidom.parseString(xml) # or minidom.parse(filename)
root = doc.getElementsByTagName('root')[0] # or doc.documentElement
items = [n for n in root.childNodes if n.nodeType == doc.ELEMENT_NODE]
for item in items:
print item.nodeName
您当然可以使用 full-blown DOM API 之类的 lxml,但对于按文档顺序迭代某些节点的适度任务,可能没有必要。