如何使用 python LXML 重命名属性名称?

How to rename an attribute name with python LXML?

关于如何使用 LXML 获取和设置属性的 value 的文档相当详细,但是有没有办法重命名 name 现有属性?

目标是从

<element old="cheese"/>

<element new="cheese"/>

我目前正在做的事情有点复杂 — 删除属性然后使用新名称和旧值重新添加它:

from io import StringIO
from lxml import etree

doc = StringIO('<element old="cheese"/>')

tree = etree.parse(doc)
elem = tree.getroot()

attr_value = elem.attrib['old']
del elem.attrib['old']
elem.attrib['new'] = attr_value

有没有办法直接重命名属性,而不是删除并重新添加新键?

首先,我希望我能对你的问题投两次赞成票,因为你给出了一个我可以 copy/paste/run 的最小的、可重现的例子。 stack overflow 的新手应该注意了!我想这是因为和你我一样久的用户并没有问那么多问题。

我不认为你所做的是那么复杂,但由于 .attrib 是一个命令,你可以改为这样做:

elem.attrib['new'] = elem.attrib.pop('old')

完整示例:

from io import StringIO
from lxml import etree

doc = StringIO('<element old="cheese"/>')

tree = etree.parse(doc)
elem = tree.getroot()

elem.attrib['new'] = elem.attrib.pop('old')

print(etree.tostring(tree).decode())

打印输出...

<element new="cheese"/>

以下与 python“开箱即用”python xml lib - ElementTree .

相同
import xml.etree.ElementTree as ET

xml = '''<element old="cheese"/>'''
root = ET.fromstring(xml)
root.attrib['new'] = root.attrib.pop('old')
ET.dump(root)

输出

<element new="cheese" />