2010-02-05 119 views
1

我想讀取一個xml文件到python中,從xml文件中拉出某些元素,然後將結果寫回到一個xml文件(所以基本上它是原始的xml文件沒有幾個要素)。當我使用.removeChild(源代碼)時,它會刪除我想要刪除的單個元素,但會留下空白區域,使文件變得無法讀取。我知道我仍然可以用所有的空格解析文件,但有時候我需要手動修改某些元素的屬性值,並且這樣做很困難(並且非常麻煩)。我當然可以手動刪除空白,但如果我有幾十個這些XML文件不是真的可行的話。Python xml.dom.minidom removeChild空白問題

有沒有辦法做.removeChild並讓它刪除白色空間?

這裏是我的代碼如下所示:

dom=parse(filename) 
main=dom.childNodes[0] 
sources = main.getElementsByTagName("source") 
for source in sources : 
    name=source.getAttribute("name") 
    spatialModel=source.getElementsByTagName("spatialModel") 
    val1=float(spatialModel[0].getElementsByTagName("parameter")[0].getAttribute("value")) 
    val2=float(spatialModel[0].getElementsByTagName("parameter")[1].getAttribute("value")) 
    if angsep(val1,val2,X,Y)>=ROI : 
     main.removeChild(source) 
    else: 
     print name,val1,val2,angsep(val1,val2,X,Y) 
f=open(outfile,"write") 
f.write("<?xml version=\"1.0\" ?>\n") 
f.write(dom.saveXML(main)) 
f.close() 

感謝很多的幫助。

+1

你怎麼寫xml文件? 'Node.toxml()'?看'Node.toprettyxml()'和'Node.writexml()' –

+0

我試過用toxml()和toprettyxml()搞亂了,並且仍然得到了同樣的問題, 。如果我找不到使用xml.dom.mini.dom的解決方案,我想我可以直接使用python搜索文檔並刪除所有空行,儘管對我來說這看起來很sl sl。 – Jamie

回答

1

我無法弄清楚如何使用xml.dom.minidom做到這一點,所以我就寫了一個快速功能讀取輸出文件並刪除所有空行,然後改寫到一個新的文件:

f = open(xmlfile).readlines() 
w = open('src_model.xml','w') 
empty=re.compile('^$') 
for line in open(xmlfile).readlines(): 
    if empty.match(line): 
     continue 
    else: 
     w.write(line) 

這對我的作品不夠好:)

1

如果你有安裝的PyXML你可以使用xml.dom.ext.PrettyPrint()

1

...搜索PPL:

這個有趣的片段

skey = lambda x: getattr(x, "tagName", None) 
mainnode.childNodes = sorted( 
    [n for n in mainnode.childNodes if n.nodeType != n.TEXT_NODE], 
    cmp=lambda x, y: cmp(skey(y), skey(x))) 

刪除所有文本節點(並且還通過標記名對它們進行反向排序)。

I.e.你可以(遞歸地)做tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE]刪除所有文本節點

或者你可能想要做一些像… if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE)(沒有自己嘗試過),如果你需要帶有一些數據的文本節點。或者更復雜的東西在特定的標籤中留下文本。

之後,tree.toprettyxml(…)將返回格式良好的XML文本。