在Python中写XML遇到问题

0 投票
2 回答
871 浏览
提问于 2025-04-17 03:52

我有一个 XML 文件,用 Python 读取这个文件。我想对这个 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

你需要进行节点替换

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()
2

替换

key.firstChild.wholeText = "new text"

可以用以下任意一个

key.firstChild.replaceWholeText("new text")

或者

key.firstChild.data = "new text"

这里的关键是,xml.dom.minidom.Text.wholeText 是一个数据描述符,它的用法更像是一个函数,而不是一个普通的属性。实际上,它会收集周围文本和CDATA节点的数据,除了它自己拥有的数据。可惜的是,它的设置器似乎没有被调用,所以当你写入wholeText时,其实是在覆盖这个函数。不过,writexml()的实现只关注data属性,而不是wholeText

这可能被视为一个bug。实际上,有人可能会把replaceWholeText()看作是wholeText属性的设置器,但这可能需要绕过这个模块为了兼容旧版本Python而使用的特殊处理。

撰写回答