使用 lxml 迭代添加子元素

Adding a subelement iteratively with lxml

我想迭代添加子元素e。 G。使用 XPath 和标记从列表到 XML 路径的特定位置。因为在我的原始代码中我有很多子节点,所以我不想使用其他函数,例如 etree.Element 或 tree.SubElement.

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

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

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