2016-01-26 46 views
3

我將單個元素插入到一個大的xml文件中。我想要插入的元素在頂部(所以我需要使用root.insert方法,不能只追加到文件)。我也想要元素的格式來匹配文件的其餘部分。使用python xml.etree模塊格式化插入的元素,以包含新行

原始XML文件的格式

<a> 
    <b> 
     <c/> 
    </b> 
    <d> 
     <e/> 
    </d> 
    .... 
</a> 

我然後運行下面的代碼:

import xml.etree.ElementTree as ET  

xmlfile = ET.parse('file.xml') 
a = xmlfile.getroot() 

f = ET.Element('f') 
g = ET.SubElement(f,'g') 

a.insert(1, f) 

xmlfile.write('file.xml') 

它創建形式輸出:

<a> 
    <b> 
     <c/> 
    </b> 
    <f><g/></f><d> 
     <e/> 
    </d> 
    .... 
</a> 

但我會喜歡它的形式:

<a> 
    <b> 
     <c/> 
    </b> 
    <f> 
     <g/> 
    </f> 
    <d> 
     <e/> 
    </d> 
    .... 
</a> 

使用Jonathan Eunice的問題解決方案'如何讓Python的ElementTree能夠很好地打印到XML文件?'我添加了以下代碼來替換xmlfile.write命令:

from xml.dom import minidom 
xmlstr = minidom.parseString(ET.tostring(a)).toprettyxml(indent=" ") 
with open("New_Database.xml", "w") as f: 
    f.write(xmlstr) 

但是,整個文件的格式仍然不正確。它正確地格式化該新元素,但現在的原始元素被隔開:

<b> 


    <c/> 


</b> 


<f> 
    <g/> 
</f> 
<c> 


    <d/> 


</c> 
.... 
</a> 

我認爲這是因爲toprettyxml()命令在增加了一個新的線「\ N」分隔符(因此增加了當前格式的2個新行)。擺弄輸入只會改變添加的元素或原始元素是否格式不正確。在我添加新元素之前,我需要一種方法來修改新元素或原始元素,以便它們的格式相同,然後在打印之前可以重新格式化整個區域?是否可以使用'xml.etree.ElementTree'添加格式?

在此先感謝。

+0

的可能的複製[?如何獲得Python的ElementTree的靚打印到一個XML文件] (http://stackoverflow.com/questions/28813876/how-do-i-get-pythons-elementtree-to-pretty-print-to-an-xml-file) – har07

+0

謝謝,我嘗試了這一點,但不幸的是它沒有成功。我已經編輯了這個問題並進一步解釋。 – thisiscomplex

回答

2

使用text and tail屬性可以擺弄空白。也許這對你來說已經夠好了。見下面的演示。

輸入文檔:

<a> 
    <b> 
     <c/> 
    </b> 
    <d> 
     <e/> 
    </d> 
</a> 

代碼:

import xml.etree.ElementTree as ET  

xmlfile = ET.parse('file.xml') 
a = xmlfile.getroot() 

f = ET.Element('f') 
g = ET.SubElement(f,'g') 

f.tail = "\n " 
f.text = "\n  " 
g.tail = "\n " 

a.insert(1, f) 

print ET.tostring(a) 

輸出:

<a> 
    <b> 
     <c /> 
    </b> 
    <f> 
     <g /> 
    </f> 
    <d> 
     <e /> 
    </d> 
</a>