【问题标题】:Python xmltodict: How to preserve XML element order?Python xmltodict:如何保留 XML 元素顺序?
【发布时间】:2016-01-06 15:03:43
【问题描述】:

我正在使用 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的原始订单?

【问题讨论】:

  • 来自the maintainer of the project:“xmltodict 设计背后的指导原则是在 XML 和嵌套的 dict+list+string 结构之间实现一种简单的映射,类似于从 JSON 文档中获得的结构,仅此而已, 不少。我无意让 xmltodict 成为一个成熟的 XML 处理框架,我认为像这张票中提出的特性是以牺牲库的易用性和代码简单性/可维护性为代价的......如果你重新达到 xmltodict 的限制,您应该使用 XPath...."
  • 这样你就有了,使用 XPath(或 lxml)。
  • 谢谢@BobDylan。我想我将不得不放弃xmltodict 并直接使用lxml :(
  • 也许如果你解释一下你实际上想要做什么,这会让人们有机会提出解决方案。
  • @Tomalak,我提供的 XML 是对一个应用程序配置文件的简化。元素&lt;a /&gt;&lt;b /&gt; 表示该系统的操作,将按顺序 应用。我正在处理的应用程序与该系统交互,但不需要知道每个架构细节。为了方便,我选择了 xmltodict;就我的目的而言,它非常简单,它直接解析为 python dicts,从而可以直接将 JSON 序列化用于其他目的。

标签: python xml xmltodict


【解决方案1】:

它不是超级优雅,但 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,但对于按文档顺序迭代某些节点的适度任务,这可能不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2013-07-13
    • 2022-01-15
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多