You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析带命名空间XML时ElementTree的find方法返回None报错问题

问题原因

你的XML定义了默认命名空间 xmlns="http://xx/it//Data/v1",该命名空间会作用于所有未显式指定前缀的标签,因此直接通过无命名空间前缀的路径查找标签时,无法匹配到实际节点,find方法返回None,调用.text就会抛出AttributeError。

可行解决方案

方案1:显式指定命名空间映射(最规范,推荐)

自定义命名空间映射字典,查找节点时给每个标签加上对应命名空间前缀,代码示例:

import xml.etree.ElementTree as ET

# 映射字典的key可自定义,value必须和XML中默认命名空间的取值完全一致
ns = {"ns": "http://xx/it//Data/v1"}

tree = ET.parse(input_filename)
location = tree.find("./ns:Header/ns:Location", ns).text
time = tree.find("./ns:Header/ns:Date", ns).attrib['start']

方案2:使用通配符匹配任意命名空间(简单快捷,Python3.8+支持)

如果不需要严格校验命名空间,可以用{*}通配符匹配任意命名空间,无需提前定义映射:

import xml.etree.ElementTree as ET

tree = ET.parse(input_filename)
location = tree.find("./{*}Header/{*}Location").text
time = tree.find("./{*}Header/{*}Date").attrib['start']

方案3:预处理移除所有命名空间(不推荐,特殊场景可用)

如果不想处理命名空间逻辑,可以在解析前通过正则移除XML内容中的所有命名空间声明,效果和你手动删除xmlns属性一致:

import re
import xml.etree.ElementTree as ET

with open(input_filename, 'r', encoding='utf-8') as f:
    xml_content = f.read()
# 正则移除所有xmlns相关属性
xml_content = re.sub(r'\sxmlns(:\w+)?="[^"]+"', '', xml_content)
root = ET.fromstring(xml_content)
location = root.find("./Header/Location").text
time = root.find("./Header/Date").attrib['start']

内容的提问来源于stack exchange,提问作者dominant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:48:03