2013-01-23 27 views
13

Tôi đã sử dụng một minidom.toprettyxml để định dạng tệp xml của mình. Khi tôi đang tạo tệp XML và sử dụng phương pháp này, tất cả đều hoạt động, nhưng nếu tôi sử dụng nó sau khi tôi đã sửa đổi tệp xml (cho examp tôi đã thêm một nút bổ sung) và sau đó tôi viết nó trở lại XML, tôi nhận được dòng sản phẩm nào, mỗi khi tôi đang cập nhật nó, tôi nhận được nhiều hơn và dòng sản phẩm nào hơn ...Đường trống trong khi sử dụng minidom.toprettyxml

mã của tôi:

file.write(prettify(xmlRoot)) 


def prettify(elem): 
    rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree 
    reparsed = mini.parseString(rough_string) //mini as minidom 
    return reparsed.toprettyxml(indent=" ") 

và kết quả:

<?xml version="1.0" ?> 
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0"  tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460"> 




    <testcase classname="TC test" name="t1" status="Failed" time="27.013"/> 




    <testcase classname="TC test" name="t2" status="Failed" time="78.325"/> 


    <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> 
</testsuite> 

bất kỳ đề xuất nào?

cảm ơn.

Trả lời

15

Tôi đã tìm thấy giải pháp tại đây: http://code.activestate.com/recipes/576750-pretty-print-xml/

Sau đó, tôi đã sửa đổi nó để lấy chuỗi thay vì tệp.

from xml.dom.minidom import parseString 

pretty_print = lambda data: '\n'.join([line for line in parseString(data).toprettyxml(indent=' '*2).split('\n') if line.strip()]) 

Output:

<?xml version="1.0" ?> 
<testsuite errors="0" failures="3" name="TestSet_2013-01-23 14_28_00.510935" skip="0" tests="3" time="142.695" timestamp="2013-01-23 14:28:00.515460"> 
    <testcase classname="TC test" name="t1" status="Failed" time="27.013"/> 
    <testcase classname="TC test" name="t2" status="Failed" time="78.325"/> 
    <testcase classname="TC test" name="t3" status="Failed" time="37.357"/> 
</testsuite> 

này có thể giúp bạn làm việc đó vào chức năng của bạn một chút dễ dàng hơn:

def new_prettify(): 
    reparsed = parseString(CONTENT) 
    print '\n'.join([line for line in reparsed.toprettyxml(indent=' '*2).split('\n') if line.strip()]) 
+0

Joe - rất tiếc là tôi nhận được ngoại lệ từ trình phân tích cú pháp "phải là chuỗi hoặc bộ đệm chỉ đọc, không phải phần tử" – Igal

+0

Joe - chỉ để làm rõ? Tôi có cần phải sử dụng mã này trong khi tôi đang tạo xml hoặc sau khi được tạo và nó chỉ xóa các dòng trống không? Cảm ơn. – Igal

+0

Giải quyết, tuyệt vời !! cảm ơn bạn ! – Igal

0

sử dụng này để giải quyết vấn đề với các dòng

toprettyxml(indent=' ', newl='\r', encoding="utf-8")

+1

Mặc dù điều này có thể giúp giải quyết vấn đề, tôi khuyên bạn nên mô tả chi tiết hơn cách câu trả lời của bạn giúp ích. – Wtower

3

Tôi tìm thấy một giải pháp dễ dàng cho vấn đề này, chỉ với thay đổi dòng cuối cùng của bạn tô điểm() vì vậy nó sẽ là:

def prettify(elem): 
rough_string = xml.tostring(elem, 'utf-8') //xml as ElementTree 
reparsed = mini.parseString(rough_string) //mini as minidom 
return reparsed.toprettyxml(indent=" ", newl='') 
0

Tôi gặp vấn đề tương tự với Python 2.7 (32b) trong Windows 10 máy. Vấn đề có vẻ là khi python phân tích cú pháp một văn bản XML thành đối tượng ElementTree, nó thêm một số dòng gây phiền nhiễu cho các thuộc tính "văn bản" hoặc "đuôi" của mỗi phần tử.

kịch bản này loại bỏ như ký tự ngắt dòng:

def removeAnnoyingLines(elem): 
    hasWords = re.compile("\\w") 
    for element in elem.iter(): 
     if not re.search(hasWords,str(element.tail)): 
      element.tail="" 
     if not re.search(hasWords,str(element.text)): 
      element.text = "" 

Sử dụng chức năng này trước khi "khá-in" cây của bạn:

removeAnnoyingLines(element) 
myXml = xml.dom.minidom.parseString(xml.etree.ElementTree.tostring(element)) 
print myXml.toprettyxml() 

Nó làm việc cho tôi. Tôi hy vọng nó làm việc cho bạn!

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