【发布时间】: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 是对一个应用程序配置文件的简化。元素
<a />和<b />表示该系统的操作,将按顺序 应用。我正在处理的应用程序与该系统交互,但不需要知道每个架构细节。为了方便,我选择了 xmltodict;就我的目的而言,它非常简单,它直接解析为 python dicts,从而可以直接将 JSON 序列化用于其他目的。