为含子元素的XML元素添加递增ID属性的问题修正
为XML中有子元素的指定元素添加递增ID属性
需求说明
- 仅为XML中至少包含一个子元素的
Fussteil、Summen、Betrag元素添加id="数字"属性,ID值按遍历顺序递增分配 - 无子元素的空元素(如
<Betrag/>)不添加ID属性
原始XML内容
<Invoice> <Fussteil> <Summen> <QF/> <UstSatz>21.00</UstSatz> <Betrag> <Bezeichnung>Steuerbetrag</Bezeichnung> <QF>124</QF> <Wert>8.8</Wert> </Betrag> </Summen> <Betrag> <Bezeichnung>Gesamtbetrag alle Zu/Abschläge</Bezeichnung> <QF>131</QF> <Wert>12.5</Wert> </Betrag> <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> </Summen> <Betrag id="3"> <Bezeichnung>Gesamtbetrag alle Zu/Abschläge</Bezeichnung> <QF>131</QF> <Wert>12.5</Wert> </Betrag> <Betrag/> <Betrag id="4"> <Bezeichnung>Gesamter Gebuehrenbetrag</Bezeichnung> <QF>176</QF> <Wert>8.8</Wert> </Betrag> </Fussteil> </Invoice>
错误代码及问题
当前代码未判断元素是否有子元素,直接给所有指定标签的元素添加了ID,包括空元素:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') val = 0 for elem in tree.iter(): if elem.tag in ["Fussteil", "Summen", "Betrag"]: elem.set("id", str(val)) val += 1 tree.write('output.xml')
错误输出示例(空<Betrag/>被错误添加了id="4"):
<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> </Summen> <Betrag id="3"> <Bezeichnung>Gesamtbetrag alle Zu/Abschläge</Bezeichnung> <QF>131</QF> <Wert>12.5</Wert> </Betrag> <Betrag id="4" /> <Betrag id="5"> <Bezeichnung>Gesamter Gebuehrenbetrag</Bezeichnung> <QF>176</QF> <Wert>8.8</Wert> </Betrag> </Fussteil> </Invoice>
修正后的代码
添加子元素数量判断,仅为有子元素的指定元素分配ID:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') val = 0 for elem in tree.iter(): # 同时满足标签在指定列表中、且存在子元素两个条件 if elem.tag in ["Fussteil", "Summen", "Betrag"] and len(elem) > 0: elem.set("id", str(val)) val += 1 tree.write('output.xml')
代码说明
len(elem)返回元素的子元素数量,空元素的子元素数量为0,通过len(elem) > 0可精准筛选出有子元素的元素- 保持ID递增逻辑不变,仅给符合条件的元素分配ID,避免空元素出现多余属性
内容的提问来源于stack exchange,提问作者JME
相关产品推荐
相关产品推荐

