При тестировании подхода к сборке XML с помощью lxml я заметил нечто необычное: при добавлении подэлемента с текстом способом etree.SubElement(parent,'name').text = 'foo'
дерево XML обновляется почти так, как если бы сначала выполнялось etree.SubElement(parent,'name')
, а затем etree.SubElement(parent,'name').text = 'foo'
,тем самым создавая дерево xml с дополнительным пустым тегом.
Случай, в котором я впервые заметил это:
PyDev console: starting.
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
from lxml import etree
root = etree.Element('entry')
method = etree.SubElement(root,'Job.get')
etree.SubElement(method,'id').text = '666'
etree.tostring(root,pretty_print=True)
b'<entry>\n <Job.get>\n <id/>\n <id>666</id>\n </Job.get>\n</entry>\n'
Обратите внимание, что есть <id/>
в дополнение к <id>666</id>
, несмотря на то, что только вводите этоподэлемент один раз.
Тест, который я специально сделал, чтобы показать, что это дает следующее - в строке 7 я ввожу:
etree.SubElement(test,'dupe').text = 'licate'
и, прежде чем нажать Enter, отредактируйте второй аргумент SubElement
to 'dup'
- из вывода etree.tostring()
видно, что есть пустой тег <dupe>
, как если бы я выполнял эту команду до и после ее редактирования.
PyDev console: starting.
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
from lxml import etree
test = etree.Element('top')
etree.tostring(test)
b'<top/>'
etree.SubElement(test,'dup').text = 'licate'
etree.tostring(test)
b'<top><dupe/><dup>licate</dup></top>'
Я не уверен, смотрю ли я на особенность PyCharm, Python - интерактивные модули против модулей, написанных на C, или что-то еще вообще.