使用 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())
输出应该是您的示例预期输出。
我想迭代添加子元素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())
输出应该是您的示例预期输出。