Закрыть тег без текста в lxml - PullRequest
4 голосов
/ 05 мая 2010

Я пытаюсь вывести файл XML, используя Python и lxml

Однако я заметил одну вещь: если у тега нет текста, он не закрывается сам. Примером этого может быть:

root = etree.Element('document')
rootTree = etree.ElementTree(root)
firstChild = etree.SubElement(root, 'test')

Вывод этого:

<document>
<test/>
</document

Я хочу, чтобы вывод был:

<document>
<test>
</test>
</document>

Так что в основном я хочу закрыть тег, который не имеет текста, но используется для значения атрибута. Как я могу это сделать? А также, как называется такой тег? Я бы гуглил его, но не знаю, как его искать.

Ответы [ 4 ]

7 голосов
/ 05 мая 2010

Обратите внимание, что <test></test> и <test/> означают одно и то же. То, что вы хотите, чтобы у test-tag действительно был текст, состоящий из одного переноса строки. Однако пустой тег без текста обычно пишется как <test/>, и нет смысла настаивать на том, чтобы он отображался как <test></test>.

5 голосов
/ 26 июля 2014

Чтобы уточнить ответ @ymv на случай, если он может помочь другим:

from lxml import etree

root = etree.Element('document')
rootTree = etree.ElementTree(root)
firstChild = etree.SubElement(root, 'test')

print(etree.tostring(root, method='html'))
### b'<document><test></test></document>'
2 голосов
/ 05 мая 2010

Используйте lxml.html.tostring для сериализации в HTML

import lxml.html
root = lxml.html.fromstring(mydocument)
print(lxml.html.tostring(root))
1 голос
/ 11 августа 2017

Использовать пустую строку '' так:

root = etree.Element('document')
etree.SubElement(root, 'test').text = ''
...