Вопрос о DOM-парсере, используемом с Python - PullRequest
1 голос
/ 05 мая 2010

Я использую следующий код Python для поиска узла в файле XML и изменения значения атрибута одного из его дочерних элементов. Изменения происходят правильно, когда узел отображается с помощью toxml (). Но когда это записывается в файл, атрибуты перестраиваются (как видно из исходного и конечного 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"))

часть исходного 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 ]

2 голосов
/ 05 мая 2010

В соответствии со стандартами XML для DOM атрибуты не хранятся в виде упорядоченной коллекции ; в реализациях Python xml.dom это NamedNodeMap , чьи документы говорят:

Порядок получения атрибутов: произвольно, но будет соответствовать жизнь DOM

В частности, нет обещания, что этот произвольный порядок будет таким же, как (семантически нерелевантный) порядок, найденный в источнике XML, который был проанализирован для построения этого DOM.

1 голос
/ 05 мая 2010

Нет гарантии на порядок подэлементов или атрибутов в спецификации XML. вам НЕ следует полагаться на упорядочение атрибутов или подэлементов в вашей бизнес-логике, оно равно гарантированно не будет работать должным образом со всеми различными синтаксическими анализаторами. В качестве примечания, я думаю, ElementTree - намного лучший способ манипулировать DOM, чем minidom, особенно если вы используете 2.5.x или новее, он встроен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...