代码之家  ›  专栏  ›  技术社区  ›  fixxxer

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

  •  1
  • fixxxer  · 技术社区  · 15 年前

    我使用下面的python代码在XML文件中搜索一个节点,并更改它的一个子节点的属性值。当使用toxml()显示节点时,更改是正确的。但是,当它被写入文件时,属性会自动重新排列(如下面的源代码和最终的XML所示)。有人能解释一下为什么会这样吗?

    #!/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"))
    

    源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>
    

    <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 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

    根据XML的DOM标准,属性不是作为 收藏;在Python的 xml.dom NamedNodeMap ,谁的 docs 说:

    获取属性的顺序是 多姆的生活

    特别是,不能保证这个任意顺序与在XML源中发现的(语义上不相关的)顺序相同,XML源被解析以构建这个DOM。

        2
  •  1
  •   user177800 user177800    15 年前

    保证不会像预期的那样在所有不同的解析器中工作。作为旁注,我想 ElementTree 是一种比minidom更好的操作DOM的方法,特别是当您使用2.5.x或更新版本时,它是内置的。