Объявление XML standalone=" yes " lxml

у меня есть xml, который я анализирую, внося некоторые изменения и сохраняя в новый файл. У него есть декларация <?xml version="1.0" encoding="utf-8" standalone="yes"?> что я хотел бы сохранить. Когда я сохраняю свой новый файл, я теряю standalone="yes" бит. Как я могу держать его внутри? Вот мой код:

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'))

5 ответов


вы можете пройти standalone аргумент ключевого слова tostring():

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

указать standalone С помощью дерево.docinfo.автономный.

попробуйте следующее:

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))

Если вы хотите показать в заголовке XML, вы должны установить его в False вместо "нет". Вот так:

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

Если нет, standalone будет установлен в " да " по умолчанию.


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

добавит объявление, Если вы используете lxml, однако я заметил, что их объявление использует полу-кавычки вместо полных кавычек.

вы также можете получить точное объявление, которое хотите, просто объединив вывод со статической строкой, которая вам нужна:

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

если вы хотите отключить вывод standalone все пройдет None вместо True или False. Звучит логично, но потребовалось некоторое время, чтобы найти и проверить его.

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

или с помощью context manager и stream 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)