使用Python Element Tree替换XML标签内数据报错求助
解决XML命名空间下ElementTree无法修改节点内容的问题
你遇到的AttributeError是因为XML带有命名空间,但你的代码没有处理命名空间,导致tree.find('Learner/DateOfBirth')找不到对应的节点,返回了None,自然无法访问.text属性。
问题核心
你的XML使用了ESFA/ILR/2018-19命名空间,ElementTree的find/findall方法默认不会识别带命名空间的节点,必须显式指定命名空间映射才能正确定位节点。
修正后的代码
下面是可以遍历所有Learner节点并将DateOfBirth替换为NULL的完整代码:
import os from xml.etree import ElementTree as et base_path = os.path.dirname(os.path.realpath(__file__)) xml_file = os.path.join(base_path, "ILR_mock_data.xml") tree = et.parse(xml_file) root = tree.getroot() # 定义命名空间映射,替换成你XML实际的命名空间URI # 可以通过 print(root.tag) 查看,输出格式类似 {http://esfa.gov.uk/ILR/2018-19}Root,大括号内的就是URI ns = {'ilr': 'http://esfa.gov.uk/ILR/2018-19'} # 遍历所有Learner节点 for learner in root.findall('ilr:Learner', ns): # 定位当前Learner下的DateOfBirth节点 dob_node = learner.find('ilr:DateOfBirth', ns) if dob_node is not None: dob_node.text = 'NULL' # 保存修改后的文件,指定编码和XML声明避免乱码 tree.write("ILR_Anon_output.xml", encoding='utf-8', xml_declaration=True)
关键说明
- 命名空间处理:必须在
find/findall中传入命名空间字典,并且节点路径要加上前缀(比如ilr:Learner),这样ElementTree才能正确识别带命名空间的节点。 - 遍历所有Learner:用
findall替代find,这样可以捕获XML中所有的Learner节点(而不是只找第一个)。 - 空值判断:增加
if dob_node is not None的判断,避免某些Learner节点没有DateOfBirth时触发报错。 - 正确保存XML:指定
encoding='utf-8'和xml_declaration=True,确保输出的XML文件格式正确,不会出现乱码或缺失声明的问题。
如何确认命名空间URI?
如果不确定XML的命名空间URI,可以在代码中添加一行print(root.tag),运行后会输出类似{http://esfa.gov.uk/ILR/2018-19}Root的内容,大括号包裹的部分就是你需要填入ns字典的URI。
内容的提问来源于stack exchange,提问作者jackkai
相关产品推荐
相关产品推荐

