2010-06-22 49 views
26

Tôi đã tạo tệp xml bằng xml.etree.ElementTree trong python. Sau đó, tôi sử dụngchèn dòng mới vào tệp xml được tạo qua xml.etree.ElementTree trong python

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

để ghi tài liệu vào tệp.

Nhưng khi tôi mở tên tệp bằng trình soạn thảo văn bản (vi trên linux), không có dòng mới giữa các thẻ. Mọi thứ đều là một dòng lớn

Làm cách nào để ghi tài liệu ở định dạng "được in đẹp" để có các dòng mới (và hy vọng là dấu ngoặc kép vv) giữa tất cả các thẻ xml?

Cảm ơn!

Trả lời

16

Giải pháp đơn giản nhất tôi nghĩ được chuyển sang thư viện lxml. Trong hầu hết các trường hợp, bạn chỉ có thể thay đổi việc nhập của mình từ import xml.etree.ElementTree as etree thành from lxml import etree hoặc tương tự.

Sau đó bạn có thể sử dụng tùy chọn pretty_print khi tuần tự:

tree.write(filename, pretty_print=True) 

(cũng có sẵn trên etree.tostring)

+0

Cảm ơn Steven. Đây là những gì tôi đã làm. –

0

According to this thread đặt cược tốt nhất của bạn sẽ được cài đặt pyXml và sử dụng để prettyprint nội dung ElementTree xml (như ElementTree dường như không có một prettyprinter theo mặc định trong Python):

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

Không có in khá hỗ trợ trong ElementTree, nhưng bạn có thể sử dụng các mô-đun XML khác.

Ví dụ, xml.dom.minidom.Node.toprettyxml():

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

Return một phiên bản khá-in của tài liệu. thụt lề xác định chuỗi thụt đầu dòng và mặc định cho một trình lập bảng; newl chỉ định chuỗi được phát ra ở cuối mỗi dòng và mặc định là \ n.

Sử dụng indentnewl để phù hợp với yêu cầu của bạn.

Một ví dụ, bằng cách sử dụng định dạng mặc định nhân vật:

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

Tốt câu trả lời, nhưng câu hỏi duy nhất là: tại sao minidom chèn khoảng trắng extraenous (ví '1' và '2 '; quan trọng trong xml)? – ChristopheD

+0

Câu hỏi hay ;-) Sử dụng cẩn thận. – gimel

+0

Sửa đổi thụt lề và newl. – gimel

26

Tôi tìm thấy một cách mới để tránh các thư viện mới và reparsing xml. Bạn chỉ cần phải vượt qua phần tử gốc của bạn để chức năng này (xem dưới đây giải thích):

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 

Có một thuộc tính có tên là "tail" trên trường xml.etree.ElementTree.Element. Thuộc tính này có thể thiết lập một chuỗi sau khi một nút:

"<a>text</a>tail" 

Tôi tìm thấy một liên kết từ năm 2004 nói về một Element Library Functions sử dụng này "đuôi" để thụt một phần tử.

Ví dụ:

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) 

Kết quả trên "example.xml":

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

Anh ấy đã đưa bạn lên một giải pháp tuyệt vời - nếu đó là bất kỳ sự an ủi nào, tôi đang sử dụng mã của bạn và nó hoạt động tốt! – Dagrooms

Các vấn đề liên quan