如何用Python解析包含XML Schema信息的XML文件?
解决XML命名空间导致ElementTree无法获取字段的问题
问题原因
你的XML文件使用了默认命名空间 http://www.myschool.com/schmea/studentData,所有子元素(如stuRec、as、acctDt等)都属于这个命名空间。xml.etree.ElementTree 在查找元素时必须明确指定命名空间,否则无法匹配到对应的标签。
同时你的代码存在两处逻辑错误:
- 根节点已经是
studentData,使用.//studentData找不到任何子元素 - 直接调用
find('acctDt')忽略了命名空间,返回None会导致后续.text调用报错
修正后的代码
import xml.etree.ElementTree as ET # 解析XML文件 mytree = ET.parse("/Users/user/student.xml") myroot = mytree.getroot() # 定义命名空间映射,前缀可自定义(这里用ns) ns = {'ns': 'http://www.myschool.com/schmea/studentData'} # 遍历所有stuRec元素 for stu_rec in myroot.findall('.//ns:stuRec', ns): # 获取acctDt字段 acct_dt = stu_rec.find('.//ns:acctDt', ns).text # 获取prov字段 prov = stu_rec.find('.//ns:prov', ns).text print(f"acctDt: {acct_dt}, prov: {prov}")
代码说明
- 命名空间映射:创建字典
ns,将自定义前缀ns绑定到XML的命名空间URI,在XPath表达式中用ns:前缀指代该命名空间 - 正确查找元素:使用
findall和find时,第二个参数传入命名空间字典,XPath表达式中通过ns:前缀指定元素所属的命名空间 - 遍历目标元素:直接遍历
stuRec元素(而非studentData),再通过相对路径定位acctDt和prov字段
运行输出
acctDt: 2023-04-04, prov: AB acctDt: 2023-05-14, prov: ON
内容的提问来源于stack exchange,提问作者Trango
相关产品推荐
相关产品推荐

