2013-01-23 20 views
13

私はxmlファイルをprettifyするためにminidom.toprettyxmlを使用しています。 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

Joe - 残念ながら、パーサから例外が発生しています。 "要素ではなく、文字列または読み取り専用のバッファでなければなりません" – Igal

+0

Joe - これを明確にするには? xmlを作成している間、または作成後に空の行を削除するだけで、このコードを使用する必要がありますか?ありがとう。 – Igal

+0

解決済み、すばらしい!ありがとうございました ! – Igal

0

使用することは、これはラインの問題を解決して

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

+1

これが問題の解決に役立つかもしれませんが、回答がどのように役立つかを詳しく説明することをお勧めします。 – Wtower

3

は、私はちょうどあなたが(飾り立てるの最後の行 を変更すると、この問題の簡単な解決策を見つけた)ので、それは次のようになります。私は(32b)は、WindowsでのPython 2.7で同じ問題を抱えてい

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

10マシン。この問題は、PythonがXMLテキストをElementTreeオブジェクトに解析するときに、各要素の「テキスト」属性または「テール」属性のいずれかに厄介な改行を追加する問題があるようです。

このスクリプトは、改行文字を削除します。

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

それは私のために働きました。私はそれがあなたのために働くことを望む!

関連する問題