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 ответ:
Обратите внимание, что
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.