Python Minidom: изменить значение узла - PullRequest
3 голосов
/ 10 ноября 2011

Я использую библиотеку Python minidom, чтобы попытаться манипулировать некоторыми XML-файлами. Вот пример файла:

<document>
    <item>
            <link>http://www.this-is-a-url.com/</link>
            <description>This is some information!</description>
    </item>

    <item>
            <link>http://www.this-is-a-url.com/</link>
            <description>This is some information!</description>
    </item>

    <item>
            <link>http://www.this-is-a-url.com/</link>
            <description>This is some information!</description>
    </item>
</document>

Что мне нужно сделать, это взять значение в «description» и поместить его в «link», чтобы оба сказали «Это некоторая информация!». Я пытался сделать это так:

#!/usr/bin/python

from xml.dom.minidom import parse

xmlData = parse("file.xml")

itmNode = xmlData.getElementsByTagName("item")
for n in itmNode:
    n.childNodes[1] = n.childNodes[3]
    n.childNodes[1].tagName = "link"
print xmlData.toxml()

Однако "n.childNodes [1] = n.childNodes [3]", кажется, связывает два узла вместе, поэтому, когда я делаю "n.childNodes [1] .tagName =" link "", чтобы исправить имя ОБА дочерние узлы становятся «связью», где раньше они оба были «описанием».

Кроме того, если я использую «n.childNodes [1] .nodeValue», изменения не будут работать, и XML будет напечатан в своем первоначальном виде. Что я делаю не так?

1 Ответ

5 голосов
/ 11 ноября 2011

Я не уверен, что вы можете изменить DOM на месте с помощью xml.dom.minidom (хотя создание всего документа с новыми значениями должно работать).

В любом случае, если вы принимаете решение на основе xml.etree.ElementTree (я настоятельно рекомендую использовать его, поскольку он обеспечивает более дружественный интерфейс), тогда вы можете использовать следующий код:

from xml.etree.ElementTree import ElementTree, dump

tree = ElementTree()
tree.parse('file.xml')

items = tree.findall('item')
for item in items:
    link, description = list(item)
    link.text = description.text

dump(tree)
...