2013-07-01 32 views
35

Tôi đang cố sử dụng xml.etree.elementtree để ghi các tệp xml bằng Python. Vấn đề là họ tiếp tục được tạo ra trong một dòng duy nhất. Tôi muốn có thể dễ dàng tham khảo chúng vì vậy nếu có thể tôi thực sự muốn có thể viết ra một cách rõ ràng.Sử dụng xml.etree.elementtree để in các tệp xml được định dạng độc đáo

Đây là những gì tôi nhận được

<Language><En><Port>Port</Port><UserName>UserName</UserName></En><Ch><Port>IP地址</Port><UserName>用户名称</UserName></Ch></Language> 

Đây là những gì tôi muốn thấy.

<Language> 
    <En> 
     <Port>Port</Port> 
     <UserName>UserName</UserName> 
    </En> 
    <Ch> 
     <Port>IP地址</Port> 
     <UserName>用户名称</UserName> 
    </Ch> 
</Language> 
+30

Đây không phải là một bản sao đúng: Một câu hỏi khác rời khỏi khả năng sử dụng _any_ thư viện XML. Câu hỏi này yêu cầu cụ thể cho một giải pháp khi bạn đã làm việc với thư viện tree_ element_ trong phần tử. Imho nó có ý nghĩa hoàn hảo để đặt câu hỏi này đặc biệt cho thư viện này, bởi vì nó rõ ràng là một tính năng còn thiếu? – bluenote10

+1

bạn có thể sử dụng một chức năng giống như chức năng tôi tìm thấy ở đây: http://effbot.org/zone/element-lib.htm#prettyprint –

+0

@ bluenote10 Khi ai đó báo cáo, những người khác sẽ báo cáo lại, chỉ cần làm theo điều gì đó. Tôi đến từ Colombia, xin lỗi vì tiếng anh xấu của tôi. –

Trả lời

51

Bạn có thể sử dụng chức năng toprettyxml từ xml.dom.minidom để làm điều đó:

def prettify(elem): 
    """Return a pretty-printed XML string for the Element. 
    """ 
    rough_string = ElementTree.tostring(elem, 'utf-8') 
    reparsed = minidom.parseString(rough_string) 
    return reparsed.toprettyxml(indent="\t") 

Ý tưởng là để in của bạn Element trong một chuỗi, phân tích nó bằng minidom và chuyển đổi nó một lần nữa trong XML sử dụng chức năng toprettyxml.

Nguồn: http://pymotw.com/2/xml/etree/ElementTree/create.html

+9

Điều này bổ sung thêm các dòng. Không chắc tôi sẽ gọi nó là đẹp. –

+4

Đối với một tệp lớn mặc dù điều này đòi hỏi phải reparsing toàn bộ XML. hmm ... –

15

Bạn có thể sử dụng thư viện lxml, mà là một superset của ElementTree. phương pháp của nó toString() bao gồm một tham số pretty_print - ví dụ:

>>> print(etree.tostring(root, pretty_print=True)) 
<root> 
    <child1/> 
    <child2/> 
    <child3/> 
</root> 
Các vấn đề liên quan