在Python中写XML遇到问题
我有一个 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而使用的特殊处理。