Python lxml Добавить подэлемент, сохраняя все родительское дерево - PullRequest
0 голосов
/ 28 января 2019

У меня есть что-то вроде этого:

<source>Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></source>

И я хочу добавить тег, продолжая получать этот результат:

<source><en>Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></en></source>

Однако ни добавление, ни вставка, ни subElement не сохраняют структуруродителя.

from lxml import etree
xml = et.fromstring('<source>Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></source>')
root = xml.getroot()
element = et.Element('en')
root.insert(0, element)
print(et.tostring(root))

Однако он вставляет пустой тег.Я не догадываюсь, как сохранить всю структуру родителя следующим образом:

<source><en />Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></source>

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вот мое решение.Надеюсь, что это поможет.

enter image description here

Ура!

0 голосов
/ 28 января 2019

Вы можете переименовать исходный корневой элемент и затем добавить его к новому корневому элементу.

from lxml import etree

old_root = etree.fromstring('<source>Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></source>')

old_root.tag = "en"
new_root = etree.Element("source")
new_root.append(old_root)

print(etree.tostring(new_root))

Результат:

<source><en>Some text <g>that is like this.<g> Needs </g></g>. <g> I want to keep this structure</g></en></source>
...