2011-10-07 52 views
0

我有一個用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」來看待,雖然,我的所有元素的「鑰匙」的標籤仍然有其CData的爲「種」,而不是「新文本」。那麼如何讓新數據寫入文件呢?

+1

你可能想看看[ElementTree的API(http://docs.python.org/library/xml.etree.elementtree.html) - 這是可能比minidom更直觀。 – millimoose

回答

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的魔法。

+0

這工作,謝謝! –

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