2012-10-13 35 views
8

Giả sử tôi có XML như thế này:Làm thế nào để thụt lề các thuộc tính khi xml in đẹp trong python?

<graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

Tên phần tử đầu tiên với tất cả các thuộc tính của nó đều xuất hiện trên cùng một dòng.

Tôi đã thấy cách khá in cây nguyên tố, sử dụng lxml, với mã như thế này:

from lxml import etree 
... 
def prettyPrintXml(filePath): 
    assert filePath is not None 
    parser = etree.XMLParser(resolve_entities=False, remove_blank_text=True, 
          strip_cdata=False) 
    document = etree.parse(filePath, parser) 
    print(etree.tostring(document, pretty_print=True, encoding='utf-8')) 

... nhưng sử dụng đó, mọi phần tử xuất hiện trên cùng một dòng.

Có câu thần chú nào để nói với máy in đẹp để chèn dòng mới giữa các thuộc tính phần tử sao cho, ví dụ, độ dài dòng không vượt quá 80 characater?

Tôi muốn kết quả tìm kiếm một cái gì đó như thế này:

<graph label="Test" 
     xmlns:dc="http://purl.org/dc/elements/1.1/" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
     xmlns:cy="http://www.cytoscape.org" 
     xmlns="http://www.cs.rpi.edu/XGMML" directed="1"> 
    <foo>...</foo> 
</graph> 

ps: Tôi không muốn dùng đến subprocessxmllint

Trả lời

2

lxml có một chức năng in khá xây dựng trong: here's a tutorial mà mô tả một số cách để in xml. Nó có một số limitations (giới hạn trong các thông số kỹ thuật xml, theo lxml), mặc dù.

This stackoverflow question có một số câu trả lời với nhiều hoặc ít giải pháp hacky để in xml đẹp và tôi nghĩ bạn có thể lập mô hình ít nhất câu trả lời dựa trên regexp cho phù hợp với nhu cầu của bạn.

Fredrik Lundh (trong số ElementTree danh tiếng) có mô tả cấp rất thấp cho printing xml, bạn cũng có thể tùy chỉnh các thuộc tính mới và thụt lề.

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