Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python xmltodict:如何保持XML元素顺序?_Python_Xml_Xmltodict - Fatal编程技术网

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

Python xmltodict:如何保持XML元素顺序?,python,xml,xmltodict,Python,Xml,Xmltodict,我使用xmltodict进行XML解析/解析,在处理一个文档时需要保留XML元素的顺序。玩具REPL示例: >>> import xmltodict >>> xml = """ ... <root> ... <a /> ... <b /> ... <a /> ... </root> ... """ >>> xmltodict.parse(xml) OrderedDict(

我使用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>'
导入xmltodict >>>xml=”“” ... ... ... ... ... ... """ >>>解析(xml) OrderedDict([('root',OrderedDict([('a',[None,None]),('b',None)])) >>>xmltodict.unparse(389;) “\n”
请注意,原始序列
[a,b,a]
[a,a,b]
替换。有没有办法用
xmltodict
保持原始顺序?

它不是非常优雅,但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
将xml.dom.minidom导入为minidom
xml=”“”
"""
doc=minidom.parseString(xml)#或minidom.parse(文件名)
root=doc.getElementsByTagName('root')[0]#或doc.documentElement
items=[n如果n.nodeType==doc.ELEMENT\u NODE,则n代表root.childNodes中的n]
对于项目中的项目:
打印item.nodeName

当然,您可以使用一个完整的DOM API,如lxml,但对于按文档顺序迭代某些节点的普通任务来说,这可能不是必需的。

From:“xmltodict设计背后的指导原则是在XML和嵌套的dict+list+字符串结构之间实现一个简单的映射,就像从JSON文档中获得的一样,不多也不少。我无意让xmltodict成为一个成熟的XML处理框架,我认为像本文中提出的功能是以牺牲库的易用性和代码的简单性/可维护性为代价的。。。如果您遇到了xmltodict的局限性,您应该使用XPath……”所以,请使用XPath(或lxml)。谢谢@BobDylan。我想我必须放弃
xmltodict
,直接使用
lxml
:(如果你解释一下你实际上想做什么,那可能会给人们一个提出解决方案的机会。@Tomalak,我提供的XML是一个应用程序配置文件的简化。元素
表示该系统的操作,将按顺序应用。我正在处理的应用程序与我选择xmltodict是为了方便;因为我的目的非常简单,它直接解析为python dicts,这使得直接JSON序列化可以用于其他目的。