2013-01-23 35 views
13

我一直在使用minidom.toprettyxml來美化我的xml文件。 當我創建XML文件並使用此方法時,所有工作都會打開,但如果在修改xml文件(例如,我添加了其他節點)之後使用它,然後我將它寫回XML,我得到空行,我更新它每一次,我越來越空行......空行同時使用minidom.toprettyxml

我的代碼:

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=" ") 

和結果:

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

有什麼建議嗎?

謝謝。

回答

15

我發現這裏的解決方案:http://code.activestate.com/recipes/576750-pretty-print-xml/

然後我修改了它一個字符串,而不是一個文件。

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()]) 

輸出:

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

這可能會幫助你的工作給你的函數一點簡單:

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

喬 - 不幸的是我得到的解析器異常「必須是字符串或只讀緩衝區,而不是元素」 – Igal

+0

喬 - 只是爲了說清楚?當我創建xml或創建後,是否需要使用此代碼,並且它只是刪除空行?謝謝。 – Igal

+0

解決,偉大!謝謝 ! – Igal

0

使用這種與線解決問題

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

+1

雖然這可能有助於解決問題,但我建議您更詳細地描述您的答案如何提供幫助。 – Wtower

3

我發現這個問題的一個簡單的解決方案,只是將最後一行 你美化(),所以這將是:

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

我在Windows(32B),具有與Python 2.7相同的問題10機器。這個問題似乎是,當python解析一個XML文本到一個ElementTree對象時,它會爲每個元素的「text」或「tail」屬性添加一些煩人的換行符。

此腳本將刪除這樣的換行符:

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

使用此功能之前, 「漂亮打印」 你的樹:

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

它爲我工作。我希望這個對你有用!