关于与Python一起使用的DOM解析器的问题

时间:2010-05-05 16:52:22

标签: python xml dom

我正在使用以下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>

2 个答案:

答案 0 :(得分:2)

根据XML的DOM标准,属性不是作为有序集合保存的;在Python的xml.dom实现中,它们是NamedNodeMap,其docs说:

  

获得属性的顺序是   任意但是会一致的   DOM的生命

特别是,没有任何承诺,这个任意顺序将与解析为构建此DOM的XML源中找到的(语义不相关)顺序相同。

答案 1 :(得分:1)

无法保证XML规范中子元素或属性的排序。您不应该依赖业务逻辑中的属性或子元素的排序, 保证不会按预期与所有各种解析器一起工作。作为旁注,我认为ElementTree是一种比minidom更好的操作DOM的方法,特别是如果你使用2.5.x或更新版本它是内置的。