2013-08-11 9 views
6

Mam xml, który parsuję, wprowadzając pewne zmiany i zapisując do nowego pliku. Ma deklarację <?xml version="1.0" encoding="utf-8" standalone="yes"?>, którą chciałbym zatrzymać. Kiedy oszczędzam mój nowy plik, tracę bit standalone="yes". Jak mogę to zatrzymać? Oto mój kod:Deklaracja 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')) 

Odpowiedz

12

można przekazać standalone kluczowego argumentu tostring():

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

TypeError: toString() dostał nieoczekiwaną kluczowego argumentu 'xml_declaration' –

+0

@ArnoldRoa używasz 'lxml.etree'? – alecxe

7

Określ standalone użyciu tree.docinfo.standalone.

Spróbuj następujący:

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

Przykro mi, twoja odpowiedź zadziałała jak czar, po prostu pomyślałem, że odpowiedź @alecxe jest łatwiejsza do zrealizowania dla mnie, w każdym razie dzięki za odpowiedź, dobrze mieć opcje. – speedyrazor

+0

@ user2446702, Dobra, rozumiem. – falsetru

2

Jeśli chcesz pokazać standalone='no' argumentu w nagłówku XML, musisz ustawić go False zamiast „nie”. Po prostu tak:

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

W przeciwnym razie tryb autonomiczny zostanie domyślnie ustawiony na "tak".

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

Doda deklarację, jeśli używasz lxml, jednak zauważyłem, że ich deklaracja używa cudzysłowów zamiast pełnych cytatów.

Można również uzyskać dokładną deklarację chcesz po prostu łącząc wyjście ze statycznym ciąg potrzebujesz:

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

Jeśli chcesz wyłączyć wyprowadzanie standalone w ogóle przejść None zamiast True lub False. Brzmi logicznie, ale zajęło mu trochę czasu, aby go znaleźć i przetestować.

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

lub przy użyciu menedżera kontekstowe i strumień etree.xmlfile serializacji:

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) 
Powiązane problemy