如何用Python向XML指定位置插入元素?求修正代码
问题:为指定XML节点批量添加子元素
原始XML结构
<PROJECT> <SUBJECT>GEOGRAPHY</SUBJECT> <PROJECT_NAME>THE-WORLD</PROJECT_NAME> <NAME>COUNTRIES</NAME> <AGE>100</AGE> <DOMAIN>MAPS</DOMAIN> <EUROPE> <WESTERN> <TYPE>ABC</TYPE> <TYPE>MNO</TYPE> <COUNTRY> <NAME>MONACO</NAME> <DETAILS> <EUROPE CAPITAL="Monaco" /> <EUROPE population= 123456 /> <EUROPE currency="euro" /> </DETAILS> </COUNTRY> <COUNTRY> <NAME>MALTA</NAME> <DETAILS> <EUROPE CAPITAL="Valletta" /> <EUROPE population=123456 /> <EUROPE currency="euro" /> </DETAILS> <DETAILS> <EUROPE FOOD="Pizza" /> <EUROPE LANGUAGE="Spanish" /> </DETAILS> </COUNTRY> <COUNTRY> <NAME>ANDORRA</NAME> <DETAILS> <EUROPE CAPITAL="Andorra la Vella" /> <EUROPE population=123456 /> <EUROPE currency="euro" /> </DETAILS> <DETAILS> <EUROPE FOOD="PIZZA" /> <EUROPE LANGUAGE="Spanish" /> </DETAILS> </COUNTRY> </WESTERN> </EUROPE> </PROJECT>
需求说明
为除第一个COUNTRY节点外的所有COUNTRY下的每一个DETAILS节点,添加<EUROPE driving_side = "right" />标签,期望效果如下:
<COUNTRY> <NAME>MONACO</NAME> <DETAILS> <EUROPE CAPITAL="Monaco" /> <EUROPE population= 123456 /> <EUROPE currency="euro" /> </DETAILS> </COUNTRY> <COUNTRY> <NAME>MALTA</NAME> <DETAILS> <EUROPE CAPITAL="Valletta" /> <EUROPE population=123456 /> <EUROPE currency="euro" /> <EUROPE driving_side = "right" /> </DETAILS> <DETAILS> <EUROPE FOOD="Pizza" /> <EUROPE LANGUAGE="Spanish" /> <EUROPE driving_side = "right" /> </DETAILS> </COUNTRY> <COUNTRY> <NAME>ANDORRA</NAME> <DETAILS> <EUROPE CAPITAL="Andorra la Vella" /> <EUROPE population=123456 /> <EUROPE currency="euro" /> <EUROPE driving_side = "right" /> </DETAILS> <DETAILS> <EUROPE FOOD="PIZZA" /> <EUROPE LANGUAGE="Spanish" /> <EUROPE driving_side = "right" /> </DETAILS> </COUNTRY>
尝试的错误代码
tasks = root.findall('.//EUROPE/WESTERN/COUNTRY') new = ET.fromstring('<EUROPE driving_side = "right" /') for index, task in enumerate(tasks): task.find('.//DETAILS').insert(3, new)
修正后的代码及解释
你的代码存在三个核心问题:
- 仅处理了每个COUNTRY下的第一个DETAILS节点
- 未跳过第一个COUNTRY节点
- 新元素的XML字符串格式错误(缺少闭合符号
>)
修正后的代码如下:
import xml.etree.ElementTree as ET # 加载XML文件 tree = ET.parse('your_xml_file.xml') root = tree.getroot() # 获取所有COUNTRY节点,从第二个开始处理(索引1及以后) countries = root.findall('.//EUROPE/WESTERN/COUNTRY')[1:] for country in countries: # 获取当前COUNTRY下的所有DETAILS节点 details_list = country.findall('./DETAILS') for details in details_list: # 每次创建新的元素实例,避免重复引用同一节点 new_europe = ET.fromstring('<EUROPE driving_side="right" />') # 将新元素添加到DETAILS的末尾 details.append(new_europe) # 保存修改后的XML tree.write('modified_xml_file.xml', encoding='utf-8', xml_declaration=True)
关键修正点:
- 用
[1:]切片跳过第一个COUNTRY节点 - 用
country.findall('./DETAILS')获取当前COUNTRY下的所有DETAILS节点,而非仅第一个 - 修复新元素的XML字符串(补全闭合符号
>) - 在循环内创建新元素实例,避免将同一个节点重复插入到多个位置(ElementTree中节点不能同时属于多个父节点)
内容的提问来源于stack exchange,提问作者Abhishek N
相关产品推荐
相关产品推荐

