2013-08-11 6 views
6

私はxmlを持っています。私はいくつかの変更を行い、新しいファイルに保存しています。それは私が保つことを望む宣言<?xml version="1.0" encoding="utf-8" standalone="yes"?>を持っています。新しいファイルを保存しているときに、standalone="yes"ビットが失われています。どうすればそれを保持できますか?ここ は私のコードです:XML宣言standalone = "yes" lxml

templateXml = """<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<package> 
    <provider>Some Data</provider> 
    <studio_display_name>Some Other Data</studio_display_name> 
</package>""" 

from lxml import etree 
tree = etree.fromstring(templateXml) 

xmlFileOut = '/Users/User1/Desktop/Python/Done.xml' 

with open(xmlFileOut, "w") as f: 
    f.write(etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8')) 

答えて

12

あなたはtostring()standaloneキーワード引数を渡すことができます。

etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8', standalone="yes") 
+1

TypeError例外:のtoString()が予期しないキーワード引数 'xml_declaration' –

+0

@ArnoldRoaを持って、あなたは 'lxml.etree'を使用していますか? – alecxe

7

tree.docinfo.standaloneを使用してstandaloneを指定します。

は、次の試してみてください。

from lxml import etree 
tree = etree.fromstring(templateXml).getroottree() # NOTE: .getroottree() 

xmlFileOut = '/Users/User1/Desktop/Python/Done.xml' 

with open(xmlFileOut, "w") as f: 
    f.write(etree.tostring(tree, pretty_print=True, xml_declaration=True, 
          encoding=tree.docinfo.encoding, 
          standalone=tree.docinfo.standalone)) 
+0

申し訳ありませんが、あなたの答えは魅力的に機能しました。私は@alecxeの回答が私のために簡単に実装できたと思っていましたが、とにかくあなたの答えがありがとうございました。 – speedyrazor

+0

@ user2446702、わかりました。 – falsetru

2

あなたのXMLヘッダーでstandalone='no'引数を表示したい場合は、代わりに「いいえ」のFalseに設定する必要があります。ちょうどこのように:

etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8', standalone=False) 

もしそうでなければ、スタンドアロンはデフォルトで「はい」に設定されます。あなたはlxmlのを使用している場合

0
etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8') 

は、しかし、私は彼らの宣言ではなく、完全な引用符の半引用符を使用して気づいた、宣言を追加します。あなたは全くNoneの代わりに、TrueまたはFalseを渡すstandaloneの出力を無効にしたい場合は

xml = etree.tostring(tree, pretty_print = True, encoding='UTF-8') 
xml = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\n' + xml 
0

はまた、あなたがちょうどあなたが必要とする静的な文字列で出力を連結したい正確な申告を得ることができます。論理的に聞こえますが、実際にそれを見つけてテストするのに時間がかかりました。

etree.tostring(tree, xml_declaration = True, encoding='utf-8', standalone=None) 

またはコンテキストマネージャとストリームetree.xmlfileシリアライズ使用:

with etree.xmlfile(open('/tmp/test.xml'), encoding='utf-8') as xf: 
    xf.write_declaration(standalone=None) 
    with xf.element('html'): 
     with xf.element('body'): 
      element = etree.Element('p') 
      element.text = 'This is paragraph' 
      xf.write(element) 
関連する問題