使用lxml迭代地添加子元素



我想迭代地添加子元素,例如,使用XPath和标记从列表添加到XML路径的特定位置。由于在我的原始代码中有许多子节点,所以我不想使用其他函数,如etree。元素或树。子元素。

对于我提供的示例,我尝试:

from lxml import etree
tree = etree.parse('example.xml')
root = tree.getroot()
new_subelements = ['<year></year>', '<trackNumber></trackNumber>']
destination = root.xpath('/interpretLibrary/interprets/interpretNames/interpret[2]/information')[2]
for element in new_subelements:
add_element = etree.fromstring(element)
destination.insert(-1, add_element)

但是这行不通。

初始example.xml文件:

<interpretLibrary>
<interprets>
<interpretNames>
<interpret>
<information>
<name>Queen</name>
<album></album>
</information>
<interpret>
<interpret>
<information>
<name>Michael Jackson</name>
<album></album>
</information>
<interpret>
<interpret>
<information>
<name>U2</name>
<album></album>
</information>
</interpret>
</interpretNames>
</interprets>
</interpretLibrary>

我想生成的输出example.xml:

<interpretLibrary>
<interprets>
<interpretNames>
<interpret>
<information>
<name>Queen</name>
<album></album>
</information>
<interpret>
<interpret>
<information>
<name>Michael Jackson</name>
<album></album>
</information>
<interpret>
<interpret>
<information>
<name>U2</name>
<album></album>
<year></year>
<trackNumber></trackNumber>
</information>
<interpret>
</interpretNames>
</interprets>
</interpretLibrary>

有更好的解决方案吗?

问题中的示例xml格式不佳(关闭的<interpret>元素应该关闭-</interpret>)。假设您解决了这个问题,您就差不多完成了—尽管还需要进行一些更改:

new_subelements = ['<year></year>', '<trackNumber></trackNumber>']
for element in new_subelements:
destination = root.xpath('//interpretNames/interpret[last()]/information/*[last()]')[0]
add_element = etree.fromstring(element)
destination.addnext(add_element)
print(etree.tostring(root).decode())

输出应该是您的示例期望输出。

最新更新