2013-03-12 9 views
29

ElementTreeを使用してXML文書を生成していますが、tostring関数には平文に変換するときにXML declarationが含まれていません。私は、次のXML宣言含めるように私の文字列を必要とするxml.etree.ElementTreeを使用してXML宣言を書く方法

from xml.etree.ElementTree import Element, tostring 

document = Element('outer') 
node = SubElement(document, 'inner') 
node.NewValue = 1 
print tostring(document) # Outputs "<outer><inner /></outer>" 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 

をただし、これを行うのいずれかの文書化の方法があるようには思えません。

ElementTreeにXML宣言をレンダリングする適切な方法はありますか?

答えて

50

私はElementTree.tostring()と方法はないようですことを見つけるために驚いています。ただし、偽のファイルにXML文書を書くためにElementTree.ElementTree.write()を使用することができます。

from io import BytesIO 
from xml.etree import ElementTree as ET 

document = ET.Element('outer') 
node = ET.SubElement(document, 'inner') 
et = ET.ElementTree(document) 

f = BytesIO() 
et.write(f, encoding='utf-8', xml_declaration=True) 
print(f.getvalue()) # your XML file, encoded as UTF-8 

this questionを参照してください。それでも、私はあなたがあなた自身の前に書かずにあなたの「スタンドアロン」属性を得ることができるとは思わない。私は最近、この問題が発生した

+0

なぜあなたはここで、「ノード」変数を定義していますか? –

+3

ありがとうございます。この行はありがとうございます。et.write(f、encoding = 'utf-8'、xml_declaration = True)保存しました。 –

15

lxmlを使用します(http://lxml.de/api.html参照)。

その後、次のことができます。

from lxml import etree 
document = etree.Element('outer') 
node = etree.SubElement(document, 'inner') 
print(etree.tostring(document, xml_declaration=True)) 
3

は、コードのいくつかの掘削後、私は次のコードスニペットが機能ElementTree.write

def write(self, file, encoding="us-ascii"): 
    assert self._root is not None 
    if not hasattr(file, "write"): 
     file = open(file, "wb") 
    if not encoding: 
     encoding = "us-ascii" 
    elif encoding != "utf-8" and encoding != "us-ascii": 
     file.write("<?xml version='1.0' encoding='%s'?>\n" % 
    encoding) 
    self._write(file, self._root, encoding, {}) 

の定義で見つかったので答えは、あなたのファイルにXMLヘッダを書き込む必要がある場合utf-8またはus-ascii以外のencoding引数を設定します。 UTF-8

+0

脆弱なハックですが、うまくいきません。それ以前にケースに入っていた)。また、 'ElementTree.ElementTree.write()'は 'xml_declaration'パラメータを持つように文書化されています(受け入れられた答えを見てください)。しかし、 'ElementTree。tostring() 'には、元の質問で尋ねられたメソッドであったそのパラメータはありません。 –

0

私はETを使用します。

try: 
    from lxml import etree 
    print("running with lxml.etree") 
except ImportError: 
    try: 
     # Python 2.5 
     import xml.etree.cElementTree as etree 
     print("running with cElementTree on Python 2.5+") 
    except ImportError: 
     try: 
      # Python 2.5 
      import xml.etree.ElementTree as etree 
      print("running with ElementTree on Python 2.5+") 
     except ImportError: 
      try: 
       # normal cElementTree install 
       import cElementTree as etree 
       print("running with cElementTree") 
      except ImportError: 
       try: 
        # normal ElementTree install 
        import elementtree.ElementTree as etree 
        print("running with ElementTree") 
       except ImportError: 
        print("Failed to import ElementTree from any known place") 

document = etree.Element('outer') 
node = etree.SubElement(document, 'inner') 
print(etree.tostring(document, encoding='UTF-8', xml_declaration=True)) 
0

あなただけ印刷したい場合、これが動作します。私は、ファイルにそれを送信しようとすると

import xml.dom.minidom as minidom 
import xml.etree.ElementTree as ET 
from xml.etree.ElementTree import Element, SubElement, Comment, tostring 

def prettify(elem): 
    rough_string = ET.tostring(elem, 'utf-8') 
    reparsed = minidom.parseString(rough_string) 
    return reparsed.toprettyxml(indent=" ") 
2

If you include the encoding='utf8', you will get an XML header ...エラーを取得:

xml.etree.ElementTree.tostringは

エンコーディング= 'UTF8' でXMLエンコーディング宣言を書き込み

サンプルのPython 2のコード:

import xml.etree.ElementTree as ElementTree 

tree = ElementTree.ElementTree(
    ElementTree.fromstring('<xml><test>123</test></xml>') 
) 
root = tree.getroot() 

print 'without:' 
print ElementTree.tostring(root, method='xml') 
print 
print 'with:' 
print ElementTree.tostring(root, encoding='utf8', method='xml') 

出力:

without: 
<xml><test>123</test></xml> 

with: 
<?xml version='1.0' encoding='utf8'?> 
<xml><test>123</test></xml> 
+0

Python 3では、印刷時にエスケープ文字が宣言に表示されます。 '<?xml version = \ '1.0 \' encoding = \ 'utf8 \'?>' –

関連する問題