Python xmltodict:如何保留XML元素顺序?

5
我使用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保留原始顺序?

6
来自该项目维护者: “xmltodict设计的指导原则是实现一种简单的映射方式,将XML文档和嵌套的字典+列表+字符串结构相对应,类似于从JSON文档中获取的结构,不多不少。我没有打算让xmltodict成为一个完整的XML处理框架,我认为像这个问题提出的功能会牺牲库的易用性和代码的简洁性/可维护性…… 如果你遇到了xmltodict的限制,应该使用XPath...." - Bob Dylan
所以,你可以使用XPath(或lxml)。 - Bob Dylan
1
也许如果您解释一下您实际想要做什么,那将给人们提出解决方案的机会。 - Tomalak
@Tomalak,我对保留原始元素顺序感兴趣。 对于我的需求,<root><a /><b /><a /></root>(我的示例中的原始XML)与<root><a /> <a /> <b /></root>(xmltodict的未解析输出)不同。 - el.atomo
1
@Tomalak,我提供的XML是一个应用程序配置文件的简化版本。元素<a /><b />表示该系统要按顺序执行的操作。我正在处理与该系统交互的应用程序,但不需要了解每个模式细节。我选择了_xmltodict_以方便使用;对于我的目的来说非常简单,它可以直接解析为Python字典,从而使其他用途的JSON序列化变得更加直接。 - el.atomo
显示剩余3条评论
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,但是对于迭代文档顺序中的一些节点这样的简单任务,它可能并不是必要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接