2

XML の解析/解析解除にxmltodictを使用していますが、1 つのドキュメントの処理中に 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か?

4

1 に答える 1

2

それは超エレガントではありませんが、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

もちろん、lxml のような本格的な DOM API を使用することもできますが、ドキュメントの順序でいくつかのノードを繰り返すというささやかなタスクでは、必要ないかもしれません。

于 2016-01-06T21:17:48.540 に答える