要素ツリーを使用してXMLを作成しています。Python - 要素ツリーがXML宣言を削除しています
私は、コードがXML宣言で始まる空のテンプレートファイルを与えています:<?xml version= "1.0"?>
ETが変更を終え、完了したXMLを書き出して宣言を取り除き、ルートタグから始めるとします。どうすればこれをやめることができますか?
書き込みコール:
ET.ElementTree(root).write(noteFile)
要素ツリーを使用してXMLを作成しています。Python - 要素ツリーがXML宣言を削除しています
私は、コードがXML宣言で始まる空のテンプレートファイルを与えています:<?xml version= "1.0"?>
ETが変更を終え、完了したXMLを書き出して宣言を取り除き、ルートタグから始めるとします。どうすればこれをやめることができますか?
書き込みコール:
ET.ElementTree(root).write(noteFile)
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)
異なるバージョンがあります。 ElementTreeの。 一部はxml_declaration
引数を受け取り、一部は受け付けません。
私が持っているものはありません。 encoding != 'utf-8'
の場合にのみ宣言を出します。だから、宣言を得るには、私はwrite(filename, encoding='UTF-8')
に電話します。
+1それは私のために働いていました。私はPython 2.6を使用します。 – vwvolodya
Ah! OK、私はそれが文書を完全に改造していたことを気付かなかった - ありがとう、それは知っていると非常に便利です。 –
XML全体をゼロから生成するか、既存の部分を再利用するかは、ElementTreeの実装に依存します。 'lxml'にはかなりスマートなキャッシングがあると信じています。小さなファイルを読み込んで書き出すだけで、ルートノード全体が再利用されます。しかし、宣言はルートノードの一部ではないので、実際にはそれを回避する方法はありません。 – abarnert
上記の解決策がうまくいかない場合は、@Olliの回答を確認してください。少しの微調整で私の一日を節約しました。 – ToTenMilan