Python使用ElementTree操作XML时false值被识别为None报错问题
问题原因
你代码的报错和XML文本里的false值没有任何关系,核心是两个低级错误:
- 节点查找路径写错:你查找
published节点时,传入find()的路径仍然是{http://somehost.eu}metadata,根本没有查找published节点,所以published变量永远返回None,自然永远进不了if published is not None的分支。 - 分支逻辑完全错误:
else分支对应的就是published is None(节点不存在)的场景,这时候没有任何可删除的节点,调用metadata.remove(published)传入None必然抛出类型错误。
另外你新建节点时没有带上文档对应的命名空间,就算创建成功,后续用带命名空间的路径查找也会匹配不到这个节点。
修复方案
- 提前抽离命名空间常量,避免重复书写长串地址出错
- 修正
published节点的查找路径,节点名要和目标字段对应 - 调整分支逻辑:只有节点真实存在时才执行修改/删除操作,节点不存在时直接创建追加即可,不需要调用
remove - 创建新节点时带上和原文档一致的命名空间,保证后续节点匹配正常
修复后的可直接运行代码:
# 定义文档使用的命名空间常量 NS = "{http://somehost.eu}" metadata = root.find(f'{NS}metadata') # 注意这里查找的是published节点,不是重复查找metadata published = metadata.find(f'{NS}published') if published is not None: # 节点存在直接修改文本即可,不需要删除重建 published.text = 'true' else: # 节点不存在直接创建新节点追加,不需要执行remove published = ET.Element(f"{NS}published") published.text = 'true' metadata.append(published)
如果你确实需要删除原有节点再重建(比如旧节点存在冗余属性需要清理),也要把remove逻辑放在published is not None的分支内:
NS = "{http://somehost.eu}" metadata = root.find(f'{NS}metadata') published = metadata.find(f'{NS}published') if published is not None: metadata.remove(published) # 无论原有节点是否存在,最后统一创建新节点追加 new_published = ET.Element(f"{NS}published") new_published.text = 'true' metadata.append(new_published)
补充说明:XML节点内的文本
false是普通字符串,不会被xml.etree.ElementTree自动识别为None,你之前拿到None完全是查找路径写错导致的,和字段本身的取值无关。
内容的提问来源于stack exchange,提问作者user2010686
相关产品推荐
相关产品推荐

