Elementtree дамп давая неправильный ответ


from lxml import etree
from xml.etree.ElementTree import Element, SubElement, dump

listing = Element("COMPUTERLISTING")
print "STARTING_WITH:", dump(listing),"ENDS_WITH."

This outputs...
STARTING_WITH:<COMPUTERLISTING />
None ENDS_WITH.

I thought it should be...
STARTING_WITH:<COMPUTERLISTING></COMPUTERLISTING> 
ENDS_WITH.

Я не понимаю этого, хотя я и болен и устал сегодня. Несопоставимые теги исправляются, как только я начинаю добавлять элементы, так что это не showstopper как таковой, но phantom None остается, что бы я ни делал. Что это дает? Я оставил импорт на всякий случай, если с ними что-то не так.

1 2

1 ответ:

Обратите внимание, что dumpследует использовать только для отладки. Кроме того, вы должны стараться избегать смешивания библиотек lxml и xml, Даже если они очень похожи. Чтобы ответить на ваш вопрос, тег без содержимого обычно пишется так:

<COMPUTERLISTING />

Это эквивалент <COMPUTERLISTING></COMPUTERLISTING>.

Вы получаете None, потому что ElementTree.dump пишет в sys.stdout, а не в файл. Когда вы печатаете вывод sys.stdout, вы также печатаете возвращаемое значение sys.stdout (которое является None):

>>> from lxml import etree
>>> listing = etree.Element("COMPUTERLISTING")
>>> etree.dump(listing)  # returns normal sys.stdout output when you do not print
<COMPUTERLISTING>test</COMPUTERLISTING>
>>> print etree.dump(listing)  # now also prints the None returned by sys.stdout
<COMPUTERLISTING>test</COMPUTERLISTING>
None

Для более чистого подхода, вы можете сделать это вместо:

>>> print etree.tostring(listing)
<COMPUTERLISTING/>

Или использовать что-то похожее на строку, которую вы печатали ранее (только с текстом):

>>> listing.text = 'test'
>>> print "STARTING_WITH:", etree.tostring(listing), "ENDS_WITH."  # now with text
STARTING_WITH: <COMPUTERLISTING>test</COMPUTERLISTING> ENDS_WITH.