我有一个用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”。那么如何将新数据写入文件?
答案 0 :(得分:2)
替换
key.firstChild.wholeText = "new text"
使用
key.firstChild.replaceWholeText("new text")
或
key.firstChild.data = "new text"
这里的关键是xml.dom.minidom.Text.wholeText
是data 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()