我已經在python中使用xml.etree.ElementTree創建了一個xml文件。然後我使用在python中通過xml.etree.ElementTree生成的xml文件中插入換行符
tree.write(filename, "UTF-8")
將文檔寫出到文件中。
但是當我使用文本編輯器(Linux上的vi)打開文件名時,標籤之間沒有新行。一切都是一條大線
如何以「漂亮打印」格式寫出文檔,以便所有xml標籤之間都有新行(並希望縮進等)?
謝謝!
我已經在python中使用xml.etree.ElementTree創建了一個xml文件。然後我使用在python中通過xml.etree.ElementTree生成的xml文件中插入換行符
tree.write(filename, "UTF-8")
將文檔寫出到文件中。
但是當我使用文本編輯器(Linux上的vi)打開文件名時,標籤之間沒有新行。一切都是一條大線
如何以「漂亮打印」格式寫出文檔,以便所有xml標籤之間都有新行(並希望縮進等)?
謝謝!
我認爲最簡單的辦法是切換到lxml庫。在大多數情況下,您可以將您的進口從import xml.etree.ElementTree as etree
更改爲from lxml import etree
或類似。
序列化時,可以再使用pretty_print
選項:
tree.write(filename, pretty_print=True)
(也可在etree.tostring
)
According to this thread您最好的選擇是安裝pyXml
並用它來prettyprint
的ElementTree
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()
有沒有漂亮的印刷支持ElementTree,但您可以使用其他XML模塊。
例如,xml.dom.minidom.Node.toprettyxml()
:
Node.toprettyxml([indent=""[, newl=""[, encoding=""]]])
返回文檔的一個相當印刷版。 indent指定縮進字符串,並默認爲製表符; newl指定在每行末尾發出的字符串,默認爲\ n。
使用indent
和newl
以符合您的要求。
一個例子,使用默認格式化字符:
>>> 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>
>>>
很好的回答,但唯一的問題是:爲什麼minidom命名插入extraenous空白(爲'1'和'2 ';重要的XML)? – ChristopheD 2010-06-22 17:56:53
好問題;-)小心使用。 – gimel 2010-06-22 18:10:45
修改縮進和newl。 – gimel 2010-06-22 18:40:49
我找到了新的方式,以避免新的圖書館和重新分析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>
他通過了一個很好的解決方案 - 如果它有任何安慰,我使用你的代碼,它運作良好! – Dagrooms 2016-12-13 22:38:36
謝謝史蒂文。這就是我最終做的。 – 2010-06-24 15:40:29