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

如何通过Python结合XPath与条件追加XML元素

解决指定条件下向XML的<prices>追加<price>元素的问题

需求说明

仅当.//tariff/name的文本等于'H-AT'时,将通过ET.fromstring创建的<price>元素,追加到对应<tariff>节点下的<tariffPart>/<prices>块中。

你的XML示例

<tariffimport>
    <tariff>
        <tariffFormula>
            <name>K-Watt</name>
        </tariffFormula>
        <status>1</status>
        <parentTariffId />
        <priority>10</priority>
        <i18n>
            <lang>
                <locale>de_DE</locale>
                <shortDescription />
            </lang>
        </i18n>
        <name>H-AT</name>
        <signatureRequired>false</signatureRequired>
        <termExtension>1</termExtension>
        <termExtensionUnit>5</termExtensionUnit>
        <cancellationPeriod>2</cancellationPeriod>
        <cancellationPeriodUnit>3</cancellationPeriodUnit>
        <contractTerm>2</contractTerm>
        <contractTermUnit>3</contractTermUnit>
        <states />
        <counties />
        <excludeCounties />
        <postalCodes />
        <excludePostalCodes />
        <cities>
            <value>town</value>
        </cities>
        <excludeCities />
        <streets />
        <networkOperatorNos />
        <excludeNetworkOperatorNos />
        <customerGroups>
            <value>PRIVATE</value>
        </customerGroups>
        <media>POWER</media>
        <image>../images/stecker.jpg</image>
        <tariffType>1</tariffType>
        <tariffPart>
            <name>AP_1</name>
            <i18n>
                <lang>
                    <locale>de_DE</locale>
                    <displayName>Arbeitspreis</displayName>
                    <shortName />
                    <description />
                    <attributes>
                        <attribute>
                            <key>minConsumption</key>
                            <value>0</value>
                            <priority>4</priority>
                        </attribute>
                        <attribute>
                            <key>maxConsumption</key>
                            <value>4999</value>
                            <priority>5</priority>
                        </attribute>
                    </attributes>
                </lang>
            </i18n>
            <prices>
                <price>
                    <currency>EUR</currency>
                    <value>0,48018</value>
                    <isPercentage>false</isPercentage>
                    <modifyPart />
                    <validfromdate>01.04.2023</validfromdate>
                </price>
            </prices>
        </tariffPart>
    </tariff>
</tariffimport>

你之前的错误点

你尝试的代码中,i.append(prices_xpath, new_price)是错误用法——append方法只能接收XML元素对象作为参数,不能传入XPath字符串。

正确实现代码

import xml.etree.ElementTree as ET

# 解析XML文件(如果从本地文件读取)
tree = ET.parse('your_xml_file.xml')
root = tree.getroot()

# 创建新的price元素
new_price = ET.fromstring("""
<price>
    <currency>EUR</currency>
    <value>0,9999</value>
    <isPercentage>false</isPercentage>
    <modifyPart/>
    <validfromdate>01.01.2024</validfromdate>
</price>
""")

# 遍历所有tariff节点
for tariff in root.findall('.//tariff'):
    # 获取当前tariff下的name元素(避免和子节点内的name混淆)
    tariff_name = tariff.find('name')
    # 检查name文本是否符合条件,同时处理节点不存在的情况
    if tariff_name is not None and tariff_name.text == 'H-AT':
        # 在当前tariff范围内定位对应的prices节点
        prices_node = tariff.find('.//tariffPart/prices')
        if prices_node is not None:
            # 追加新元素到目标节点
            prices_node.append(new_price)
        else:
            # 可选:如果prices节点不存在,可添加创建逻辑或提示
            print("未找到对应prices节点,跳过追加操作")

# 保存修改后的XML
tree.write('modified_xml.xml', encoding='utf-8', xml_declaration=True)

关键说明

  • 遍历所有<tariff>节点,确保只处理符合条件的目标节点
  • 用tariff.find('name')精准获取当前tariff的name元素,避免和其他子节点(如tariffFormula下的name)混淆
  • 通过tariff.find('.//tariffPart/prices')在当前tariff节点范围内查找目标prices,保证修改的是对应tariff下的prices块
  • 增加None判断,避免因节点缺失导致的运行报错

内容的提问来源于stack exchange,提问作者Sch0lli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:44:55