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
相关产品推荐
相关产品推荐

