2012-09-27 12 views
9

要素ツリーを使用してXMLを作成しています。Python - 要素ツリーがXML宣言を削除しています

私は、コードがXML宣言で始まる空のテンプレートファイルを与えています:<?xml version= "1.0"?> ETが変更を終え、完了したXMLを書き出して宣言を取り除き、ルートタグから始めるとします。どうすればこれをやめることができますか?

書き込みコール:

ET.ElementTree(root).write(noteFile)

答えて

18

the documentationによると:

書き込み(ファイル、エンコーディング= "US-ASCII"、xml_declaration =なし、メソッド= "XML")

XMLとして要素ツリーをファイルに書き込みます。 fileはファイル名、または書き込み用にオープンされたファイルオブジェクトです。 1が出力エンコード(デフォルトはUS-ASCII)です。 xml_declarationは、XML宣言をファイルに追加する必要があるかどうかを制御します。 neverの場合はFalse、alwaysの場合はTrue、US-ASCIIでもUTF-8でもない場合はNoneを使用します(デフォルトはNone)。メソッドは "xml"、 "html"または "text"です(デフォルトは "xml")。エンコードされた文字列を返します。

ので、write(noteFile)は、明示的にエンコーディングがUS-ASCIIまたはUTF-8ではない、とエンコーディングがUS-ASCIIであると場合にのみ、XML宣言を記述するためにそれを言っています。したがって、宣言はありません。

あなたは、ずっとこれを読んでいないあなたの次の質問は「なぜ私のUnicodeが壊れている」ことになるだろう、それでは、一度に両方を修正せた場合、私は推測している:

ET.ElementTree(root).write(noteFile, encoding="utf-8", xml_declaration=True) 
+0

Ah! OK、私はそれが文書を完全に改造していたことを気付かなかった - ありがとう、それは知っていると非常に便利です。 –

+1

XML全体をゼロから生成するか、既存の部分を再利用するかは、ElementTreeの実装に依存します。 'lxml'にはかなりスマートなキャッシングがあると信じています。小さなファイルを読み込んで書き出すだけで、ルートノード全体が再利用されます。しかし、宣言はルートノードの一部ではないので、実際にはそれを回避する方法はありません。 – abarnert

+0

上記の解決策がうまくいかない場合は、@Olliの回答を確認してください。少しの微調整で私の一日を節約しました。 – ToTenMilan

5

異なるバージョンがあります。 ElementTreeの。 一部はxml_declaration引数を受け取り、一部は受け付けません。

私が持っているものはありません。 encoding != 'utf-8'の場合にのみ宣言を出します。だから、宣言を得るには、私はwrite(filename, encoding='UTF-8')に電話します。

+0

+1それは私のために働いていました。私はPython 2.6を使用します。 – vwvolodya

関連する問題