在Python中编写XML时遇到问题

时间:2011-10-07 15:49:19

标签: python

我有一个用Python阅读的XML文件。我想在XML文件中进行一些更改并将其写回。

这是我的代码:

from xml.dom.minidom import *

filename = "file.xml"

dom = xml.dom.minidom.parse(filename)

dicts = dom.getElementsByTagName("dict")

for dict in dictList:  
    keys = dict.getElementsByTagName("key")
    for key in keys:
        keyCData = key.firstChild.wholeText
        if keyCData == "kind":
            print keyCData #prints "kind"
            key.firstChild.wholeText = "new text" 
            print key.firstChild.wholeText #prints "new text"

f = open("temp.xml", 'w')
dom.writexml(f)
f.close()

当我打开“temp.xml”来查看时,所有带有“key”标签的元素仍然将其CData称为“kind”而不是“new text”。那么如何将新数据写入文件?

2 个答案:

答案 0 :(得分:2)

替换

key.firstChild.wholeText = "new text"

使用

key.firstChild.replaceWholeText("new text")

key.firstChild.data = "new text"

这里的关键是xml.dom.minidom.Text.wholeTextdata descriptor,意味着更像是一个函数而不是属性。实际上,除了自己的数据之外,它还从附近的文本和cdata节点收集数据。不幸的是,它的setter似乎没有被调用,因此通过写入wholeText,你将覆盖该函数。但是,writexml()实施仅查看data属性,而不是wholeText

这可能被视为一个错误。实际上,有人可能会将replaceWholeText()链接为wholeText属性的setter,但它可能不得不绕过模块用来处理旧版本Python的魔力。

答案 1 :(得分:0)

您必须执行节点替换

from xml.dom.minidom import *

filename = "file.xml"

dom = xml.dom.minidom.parse(filename)

dictList = dom.getElementsByTagName("dict")

for dict in dictList:  
    keys = dict.getElementsByTagName("key")
    for key in keys:
        keyCData = key.firstChild.wholeText.strip() // clean
        if keyCData == "kind":
            new_text = dom.createTextNode('new text') // new textnode
            key.replaceChild(new_text, key.firstChild) // replace old

f = open("temp.xml", 'w')
dom.writexml(f)
f.close()