如何移除带命名空间的XML元素属性xsi:nil?
问题:移除XML元素的xsi:nil属性
需求
移除XML元素<CountryCode xsi:nil="true"></CountryCode>中的xsi:nil="true"属性,以便后续为CountryCode元素添加值,最终期望得到<CountryCode></CountryCode>。
尝试方案与问题
使用Python的xml.etree.ElementTree库编写代码,尝试通过elm.attrib.pop('nil', ns)移除属性,但执行后元素仍保留xsi:nil="true"属性,无效果。
尝试代码
import xml.etree.ElementTree as ET from pathlib import Path # 原代码遗漏该导入 # path to xml files xml_path = 'path' for c in (Path(xml_path).glob('*')): file = (str(c)) if file.endswith(".xml"): ns = {'d': 'http://www.w3.org/2001/XMLSchema-instance'} tree = ET.parse(file) root = tree.getroot() #Get specific element for e in list(root.findall('ImageSegment', ns)): elm = root.find(".//CountryCode") #Remove 'nil' attribute????? elm.attrib.pop('nil', ns) ET.dump(elm)
问题分析
- 命名空间属性匹配错误:
xsi:nil是带命名空间的属性,在ElementTree中这类属性的键格式为'{命名空间URI}属性名',即'{http://www.w3.org/2001/XMLSchema-instance}nil',直接用'nil'作为键无法匹配到目标属性。 - 代码缩进逻辑错误:处理元素的循环不在
if file.endswith(".xml")代码块内,遍历非XML文件时会报错。 - 未持久化修改:原代码仅用
ET.dump()临时输出元素,未将修改内容写回文件,无法保存更改。
解决方法
修正代码,正确处理命名空间属性并保存修改:
import xml.etree.ElementTree as ET from pathlib import Path xml_path = 'path' xsi_ns_uri = 'http://www.w3.org/2001/XMLSchema-instance' # 构造带命名空间的属性键 nil_attr_key = f'{{{xsi_ns_uri}}}nil' # 直接过滤XML文件,简化遍历逻辑 for xml_file in Path(xml_path).glob('*.xml'): tree = ET.parse(xml_file) root = tree.getroot() # 查找所有CountryCode元素(如需限定在ImageSegment下,可改为".//ImageSegment/CountryCode") for country_code_elm in root.findall(".//CountryCode"): # 移除xsi:nil属性,存在则移除,不存在不报错 country_code_elm.attrib.pop(nil_attr_key, None) # 保存修改后的XML文件,保留XML声明与UTF-8编码 tree.write(xml_file, encoding='utf-8', xml_declaration=True) # 可选:输出验证修改结果 ET.dump(root)
关键说明
- 用完整的命名空间属性键匹配目标属性,确保能精准移除
xsi:nil。 - 简化文件遍历逻辑,避免不必要的判断步骤。
- 通过
tree.write()将修改写入原文件,保证更改持久生效。
内容的提问来源于stack exchange,提问作者Rina Tse
相关产品推荐
相关产品推荐

