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.