2010-06-22 29 views
26

我已經在python中使用xml.etree.ElementTree創建了一個xml文件。然後我使用在python中通過xml.etree.ElementTree生成的xml文件中插入換行符

tree.write(filename, "UTF-8") 

將文檔寫出到文件中。

但是當我使用文本編輯器(Linux上的vi)打開文件名時,標籤之間沒有新行。一切都是一條大線

如何以「漂亮打印」格式寫出文檔,以便所有xml標籤之間都有新行(並希望縮進等)?

謝謝!

回答

16

我認爲最簡單的辦法是切換到lxml庫。在大多數情況下,您可以將您的進口從import xml.etree.ElementTree as etree更改爲from lxml import etree或類似。

序列化時,可以再使用pretty_print選項:

tree.write(filename, pretty_print=True) 

(也可在etree.tostring

+0

謝謝史蒂文。這就是我最終做的。 – 2010-06-24 15:40:29

0

According to this thread您最好的選擇是安裝pyXml並用它來prettyprintElementTree XML內容(如ElementTree的似乎並不在默認情況下在Python中prettyprinter):

import xml.etree.ElementTree as ET 

from xml.dom.ext.reader import Sax2 
from xml.dom.ext import PrettyPrint 
from StringIO import StringIO 

def prettyPrintET(etNode): 
    reader = Sax2.Reader() 
    docNode = reader.fromString(ET.tostring(etNode)) 
    tmpStream = StringIO() 
    PrettyPrint(docNode, stream=tmpStream) 
    return tmpStream.getvalue() 
9

有沒有漂亮的印刷支持ElementTree,但您可以使用其他XML模塊。

例如,xml.dom.minidom.Node.toprettyxml()

Node.toprettyxml([indent=""[, newl=""[, encoding=""]]])

返回文檔的一個相當印刷版。 indent指定縮進字符串,並默認爲製表符; newl指定在每行末尾發出的字符串,默認爲\ n。

使用indentnewl以符合您的要求。

一個例子,使用默認格式化字符:

>>> from xml.dom import minidom 
>>> from xml.etree import ElementTree 
>>> tree1=ElementTree.XML('<tips><tip>1</tip><tip>2</tip></tips>') 
>>> ElementTree.tostring(tree1) 
'<tips><tip>1</tip><tip>2</tip></tips>' 
>>> print minidom.parseString(ElementTree.tostring(tree1)).toprettyxml() 
<?xml version="1.0" ?> 
<tips> 
    <tip> 
     1 
    </tip> 
    <tip> 
     2 
    </tip> 
</tips> 

>>> 
+3

很好的回答,但唯一的問題是:爲什麼minidom命名插入extraenous空白(爲'1'和'2 ';重要的XML)? – ChristopheD 2010-06-22 17:56:53

+0

好問題;-)小心使用。 – gimel 2010-06-22 18:10:45

+0

修改縮進和newl。 – gimel 2010-06-22 18:40:49

26

我找到了新的方式,以避免新的圖書館和重新分析XML。 你只需要你的根元素傳遞給這個函數(見下文解釋):

def indent(elem, level=0): 
    i = "\n" + level*" " 
    if len(elem): 
     if not elem.text or not elem.text.strip(): 
      elem.text = i + " " 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
     for elem in elem: 
      indent(elem, level+1) 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
    else: 
     if level and (not elem.tail or not elem.tail.strip()): 
      elem.tail = i 

上有xml.etree.ElementTree.Element實例名爲「tail」的屬性。 這個屬性可以在節點後設置一個字符串:

"<a>text</a>tail" 

我找到了一個鏈接從2004年講述使用這個「尾巴」縮進元素的Element Library Functions

示例: 「的example.xml」

root = ET.fromstring("<fruits><fruit>banana</fruit><fruit>apple</fruit></fruits>""") 
tree = ET.ElementTree(root) 

indent(root) 
# writing xml 
tree.write("example.xml", encoding="utf-8", xml_declaration=True) 

結果:

<?xml version='1.0' encoding='utf-8'?> 
<fruits> 
    <fruit>banana</fruit> 
    <fruit>apple</fruit> 
</fruits> 
+2

他通過了一個很好的解決方案 - 如果它有任何安慰,我使用你的代碼,它運作良好! – Dagrooms 2016-12-13 22:38:36

相關問題