我正在使用以下python代码在XML文件中搜索节点并更改其中一个子节点的属性值。当使用toxml()显示节点时,正确发生更改。但是,当它被写入文件,属性重新排列(如下面的Source和Final XML中所示)。任何人都可以解释这是怎么发生以及为什 Python代码:
#!/usr/bin/env python
import xml
from xml.dom.minidom import parse
dom=parse("max.xml")
#print "Please enter the store name:"
for sku in dom.getElementsByTagName("node"):
if sku.getAttribute("name") == "store":
sku.childNodes[1].childNodes[5].setAttribute("value","Delhi,India")
print sku.toxml()
xml.dom.ext.PrettyPrint(dom, open("new.xml", "w"))
Source XML的一部分:
<node name='store' node_id='515' module='mpx.lib.node.simple_value.SimpleValue' config_builder='' inherant='false' description='Configurable Value'>
<match>
<property name='1' value='point'/>
<property name='2' value='0'/>
<property name='val' value='Store# 09204 Staten Island, NY'/>
<property name='3' value='str'/>
</match>
</node>
最终XML:
<node config_builder="" description="Configurable Value" inherant="false" module="mpx.lib.node.simple_value.SimpleValue" name="store" node_id="515">
<match>
<property name="1" value="point"/>
<property name="2" value="0"/>
<property name="val" value="Delhi,India"/>
<property name="3" value="str"/>
</match>
</node>
答案 0 :(得分:2)
根据XML的DOM标准,属性不是作为有序集合保存的;在Python的xml.dom
实现中,它们是NamedNodeMap,其docs说:
获得属性的顺序是 任意但是会一致的 DOM的生命
特别是,没有任何承诺,这个任意顺序将与解析为构建此DOM的XML源中找到的(语义不相关)顺序相同。
答案 1 :(得分:1)
无法保证XML规范中子元素或属性的排序。您不应该依赖业务逻辑中的属性或子元素的排序, 保证不会按预期与所有各种解析器一起工作。作为旁注,我认为ElementTree是一种比minidom更好的操作DOM的方法,特别是如果你使用2.5.x或更新版本它是内置的。