lxml удаляет теги ‹?xml › при разборе?

В настоящее время я работаю с разбором XML-документов (добавление элементов, добавление атрибутов и т.д.). Поэтому мне сначала нужно проанализировать XML, прежде чем работать над ним. Однако lxml, похоже, удаляет элемент <?xml ...>. Например

from lxml import etree

tree = etree.fromstring('<?xml version="1.0" encoding="utf-8"?><dmodule>test</dmodule>', etree.XMLParser())
print etree.tostring(tree)

приведет к

<dmodule>test</dmodule>

Кто-нибудь знает, почему элемент <?xml ...> удаляется? Я думал, что теги кодирования являются допустимыми XML. Спасибо за ваше время.


person axsuul    schedule 12.07.2010    source источник


Ответы (2)


Элемент <?xml> представляет собой XML-декларацию, поэтому строго не является элементом. Он просто дает информацию о XML-дереве под ним.

Если вам нужно распечатать его с помощью lxml, здесь есть некоторая информация о флаге xmlDeclaration=TRUE, который вы можете использовать.

http://lxml.de/api.html#serialisation

etree.tostring(tree, xml_declaration=True)
person VMDX    schedule 12.07.2010
comment
Спасибо, это то, что я искал. Кроме того, мне пришлось добавить etree.tostring(tree, xml_declaration=True, encoding="utf-8"), чтобы получить желаемую кодировку. - person axsuul; 13.07.2010
comment
@Axsuul: utf-8 — кодировка по умолчанию - person John Machin; 13.07.2010

Кто-нибудь знает, почему элемент <?xml ...> удаляется?

XML по умолчанию имеет версию 1.0 в UTF-8, поэтому документ эквивалентен, если вы удалите их.

Вы анализируете некоторый XML в структуру данных, а затем конвертируете эту структуру данных обратно в XML. Вы получите представление этой структуры данных в XML, но оно может быть выражено иначе (поэтому пролог можно удалить, а <foo /> можно заменить на <foo></foo> и т. д.).

person Quentin    schedule 12.07.2010
comment
Есть ли способ сохранить его там? - person axsuul; 13.07.2010
comment
Зачем? Это не имеет абсолютно никакого значения для любого парсера XML. - person bobince; 13.07.2010