python lxml 添加一个保留所有父树的子元素

python lxml Add a subelement keeping all the parent tree

我有这样的东西:

<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>

但是,append、insert 或 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>

您可以重命名原始根元素,然后将其附加到新的根元素。

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>

这是我的解决方案。希望这会有所帮助。

干杯!