You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为含子元素的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:27:23