如何用Python为XML元素添加递增整数id属性
给XML元素按遍历顺序添加递增ID属性的解决方案
需求说明
需要为现有XML文件中的元素添加id="number"属性,其中number按照元素的遍历顺序递增。
现有XML结构
<Invoice> <Fussteil> <Summen> <QF/> <UstSatz>21.00</UstSatz> <Betrag> <Bezeichnung>Steuerbetrag</Bezeichnung> <QF>124</QF> <Wert>8.8</Wert> </Betrag> <Betrag> <Bezeichnung>steuerpflichtiger Betrag</Bezeichnung> <QF>125</QF> <Wert>41.9</Wert> </Betrag> </Summen> <Betrag> <Bezeichnung>Gesamtbetrag alle Zu/Abschläge</Bezeichnung> <QF>131</QF> <Wert>12.5</Wert> </Betrag> <Betrag> <Bezeichnung>Gesamter Gebuehrenbetrag</Bezeichnung> <QF>176</QF> <Wert>8.8</Wert> </Betrag> </Fussteil> </Invoice>
目标XML结构
<Invoice> <Fussteil id="0" > <Summen id="1"> <QF/> <UstSatz>21.00</UstSatz> <Betrag id="2"> <Bezeichnung>Steuerbetrag</Bezeichnung> <QF>124</QF> <Wert>8.8</Wert> </Betrag> <Betrag id="3"> <Bezeichnung>steuerpflichtiger Betrag</Bezeichnung> <QF>125</QF> <Wert>41.9</Wert> </Betrag> </Summen> <Betrag id="4"> <Bezeichnung>Gesamtbetrag alle Zu/Abschläge</Bezeichnung> <QF>131</QF> <Wert>12.5</Wert> </Betrag> <Betrag id="5"> <Bezeichnung>Gesamter Gebuehrenbetrag</Bezeichnung> <QF>176</QF> <Wert>8.8</Wert> </Betrag> </Fussteil> </Invoice>
原代码问题分析
原代码使用递归遍历XML元素,但仅能设置固定的id值,原因是没有维护一个在递归过程中持续递增的计数器——普通数值变量在每次递归调用时会被重新初始化,无法保留递增状态。
解决方案
以下提供两种可行的修改方案:
方案一:使用可变对象传递计数器
利用列表(可变类型)来存储计数器,确保递归过程中计数器的值能被持续修改:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() def add_ID(root, counter): for child in root: # 为当前元素设置id child.set('id', str(counter[0])) # 计数器递增 counter[0] += 1 # 递归处理子元素 add_ID(child, counter) # 初始化计数器,用列表包裹以便在递归中修改 add_ID(root, [0]) tree.write('output.xml')
方案二:使用nonlocal关键字
通过嵌套函数和nonlocal关键字,让内部递归函数可以访问并修改外部函数的计数器变量:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() def add_ID(root): # 初始化计数器 counter = 0 def traverse(node): nonlocal counter for child in node: child.set('id', str(counter)) counter += 1 traverse(child) # 启动遍历 traverse(root) add_ID(root) tree.write('output.xml')
说明
两种方案都能实现按遍历顺序为元素分配递增的id属性,最终生成的XML会与目标结构一致。
内容的提问来源于stack exchange,提问作者JME
相关产品推荐
相关产品推荐

