如何通过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
相关产品推荐
相关产品推荐

