Python xmltodict: как сохранить порядок элементов XML?

Я использую xmltodict для синтаксического анализа / разбора XML, и мне нужно сохранить порядок элементов 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?

1 ответ

Решение

Это не супер элегантно, но минидом может отлично справиться с этой задачей:

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

Конечно, вы можете использовать полнофункциональный DOM API, такой как lxml, но для скромной задачи итерации некоторых узлов в порядке документов это может быть не нужно.

Другие вопросы по тегам