Python xmltodict:如何保持XML元素顺序?
我使用xmltodict进行XML解析/解析,在处理一个文档时需要保留XML元素的顺序。玩具REPL示例: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(
>>> 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序列化可以用于其他目的。