[d]python解析xml后,节点的属性顺序发生了变更
[d]python解析xml后,节点的属性顺序发生了变化
比如说一个xml文件的节点如下:
但是经过解析后,我重新产生一个xml文件,节点就变成了下面的样子
好像是python默认的把节点的属性顺序给排了一下,但是要求是不能改变节点的属性顺序,请教各位帮助一下,不胜感激
我用的是xml.dom.minidom解析。就算我新创建一个节点,设置属性的时候先设置Name再设置ID,结果产生出来的xml文件节点的属性还是ID在Name前面
---------------------------
Double行动:
原帖分数:40
帖子加分:40
------解决方案--------------------
看你的样子貌似属性字典被排序了
但是我测试了一下,貌似字典默认不会排序的
贴代码吧,楼主
比如说一个xml文件的节点如下:
- XML code
<Queue Name="CHS_DHC_KLB" ID="23561" /> <Queue Name="CHS_DHC_EHB" ID="23562" /> <Queue Name="CHS_DHC_DVB" ID="23563" />
但是经过解析后,我重新产生一个xml文件,节点就变成了下面的样子
- XML code
<Queue ID="23561" Name="CHS_DHC_KLB" /> <Queue ID="23562" Name="CHS_DHC_EHB" /> <Queue ID="23563" Name="CHS_DHC_DVB" />
好像是python默认的把节点的属性顺序给排了一下,但是要求是不能改变节点的属性顺序,请教各位帮助一下,不胜感激
我用的是xml.dom.minidom解析。就算我新创建一个节点,设置属性的时候先设置Name再设置ID,结果产生出来的xml文件节点的属性还是ID在Name前面
---------------------------
Double行动:
原帖分数:40
帖子加分:40
------解决方案--------------------
看你的样子貌似属性字典被排序了
但是我测试了一下,貌似字典默认不会排序的
贴代码吧,楼主
- Python code
>>> d = {'Name':'test','ID':'2232'} >>> d {'Name': 'test', 'ID': '2232'} >>> for k,v in d.items(): print k,v Name test ID 2232 >>>
------解决方案--------------------
stackoverflow上说用minidom不能规定属性的顺序
http://stackoverflow.com/questions/662624/preserve-order-of-attributes-when-modifying-with-minidom
------解决方案--------------------
测试了一下,还真是不能排顺序,而且查过资料,minidom还真就不能做到你的要求
- Python code
from xml.dom.minidom import parseString, getDOMImplementation from collections import OrderedDict impl = getDOMImplementation() dom3 = parseString('''<hello><Queue Name="CHS_DHC_KLB" ID="23561" /><Queue Name="CHS_DHC_EHB" ID="23562" /><Queue Name="CHS_DHC_DVB" ID="23563" /></hello>''') newdom = impl.createDocument(None, 'out', None) queues=dom3.getElementsByTagName("Queue") root=newdom.documentElement for queue in queues: item=newdom.createElement("Queue") item.setAttribute("Name",queue.getAttribute("Name")) item.setAttribute("ID",queue.getAttribute("ID")) # item._attrs=OrderedDict([('one','hello'), ('tow','world'), ('three', 'good')]) root.appendChild(item) print newdom.toxml()
------解决方案--------------------
collections 中的 OrderedDict 可以按初始化顺序输出,
- Python code
$ python Python 2.7.3 (default, Apr 20 2012, 22:44:07) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from collections import OrderedDict as dict >>> d = {'Name':'test','ID':'2232','AAA':'aaa','BBB':'bbb'} >>> dd = dict(Name='test',ID='2232',AAA='aaa',BBB='bbb') >>> for k,v in d.items(): ... print k,v ... AAA aaa Name test BBB bbb ID 2232 >>> for k,v in dd.items(): ... print k,v ... AAA aaa ID 2232 BBB bbb Name test >>>