На первый взгляд дублированные подэлементы xml с использованием lxml и Python 3.7 - PullRequest
0 голосов
/ 28 февраля 2019

При тестировании подхода к сборке 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, или что-то еще вообще.

...