2014-05-05 3 views
2

Я использую python's xml.etree.ElementTree для представления XML-документа. Я хочу вывести его в текст, но я хочу, чтобы пустые элементы (элементы без детей) расширялись, а не сворачивались. Например, я хочу это:не сбрасывают пустые узлы в XML-вывод

<element></element> 

Вместо этого:

<element /> 

настоящее время я использую ElementTree.tostring, но я готов использовать любые другие встроенные питона модулей или функций для сериализации документа, если я могу довольно легко использовать с ним объект ElementTree.

FYI, причина, по которой я хочу, чтобы элементы были расширены, заключается в том, что я хочу более легко разграничить вывод с выходом сторонней программы, которая не разрушает пустые элементы.

ответ

5

Вы можете пройти method="html" до звонка tostring().

Демо:

>>> import xml.etree.ElementTree as etree 
>>> data = """ 
... <root> 
...  <person/> 
...  <person></person> 
... </root> 
... """ 
>>> tree = etree.fromstring(data) 
>>> print etree.tostring(tree, method="html") 
<root> 
    <person></person> 
    <person></person> 
</root> 
+0

К сожалению, метод HTML вывода не правильно сохранить регистр тегов. Например, если у вас есть тег смешанного случая, такой как «крестьянинФармер», тег открытия правильный, но закрывающий тег - «крестьянин» (обратите внимание на нижний регистр «f»). Не уверен, что это ошибка или если она преднамеренно, потому что HTML должен быть нечувствительным к регистру (хотя я бы подумал, что пары пар еще должны соответствовать). – brianmearns

+0

@ sh1ftst0rm хороший улов, выглядит как [ошибка] (http://bugs.python.org/issue18347). – alecxe

3

Просто используйте: ElementTree.tostring(element, short_empty_elements=False)

+0

Это также работает при сохранении всего документа в файле tree.write (имя_файла, кодировка = "UTF-8", short_empty_elements = False) – Octo