2011-02-23 30 views
10

Sau khi đọc từ một tệp hiện có với XML 'xấu' và thực hiện một số sửa đổi, in ấn đẹp không hoạt động. Tôi đã thử etree.write(FILE_NAME, pretty_print=True).Máy in Python khá XML với lxml

Tôi đã XML sau:

<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests"> 
    <testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306"> 
.... 

Và tôi sử dụng nó như thế này:

tree = etree.parse('original.xml') 
root = tree.getroot() 

...  
# modifications 
... 

with open(FILE_NAME, "w") as f: 
    tree.write(f, pretty_print=True) 

Trả lời

33

Đối với tôi, vấn đề này đã không được giải quyết cho đến khi tôi nhận thấy miếng ngon chút này đây:

http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output

phiên bản ngắn:

đọc trong file bằng lệnh này:

>>> parser = etree.XMLParser(remove_blank_text=True) 
>>> tree = etree.parse(filename, parser) 

Điều đó sẽ "thiết lập lại" thụt đầu dòng đã tồn tại, cho phép đầu ra để tạo ra nó thụt đầu dòng của riêng một cách chính xác. Sau đó pretty_print như bình thường:

>>> tree.write(<output_file_name>, pretty_print=True) 
6
fp = file('out.txt', 'w') 
print(e.tree.tostring(...), file=fp) 
fp.close() 
+0

e.tree là gì? –

7

Vâng, theo API docs, không có phương pháp "ghi" trong mô-đun lxml etree. Bạn đã có một vài tùy chọn liên quan đến việc nhận một chuỗi xml được in đẹp vào một tệp. Bạn có thể sử dụng phương thức toString như vậy:

f = open('doc.xml', 'w') 
f.write(etree.tostring(root, pretty_print=True)) 
f.close() 

Hoặc, nếu nguồn đầu vào của bạn là ít hơn hoàn hảo và/hoặc bạn muốn biết thêm nút bấm và nút để cấu hình ra bạn đặt bạn có thể sử dụng một trong những gói python cho gọn gàng.

http://utidylib.berlios.de/

import tidy 
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1})) 

http://countergram.com/open-source/pytidylib

from tidylib import tidy_document 
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1}) 
f.write(document) 
2

Tôi không chắc tại sao các câu trả lời khác không đề cập đến điều này. Nếu bạn muốn lấy gốc của số xml, có một phương thức có tên là getroot(). Tôi hy vọng tôi đã trả lời câu hỏi của bạn (mặc dù hơi muộn).

tree = et.parse(xmlFile) 
root = tree.getroot() 
Các vấn đề liên quan