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

如何用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}")

代码说明

  1. 命名空间映射:创建字典ns,将自定义前缀ns绑定到XML的命名空间URI,在XPath表达式中用ns:前缀指代该命名空间
  2. 正确查找元素:使用findall和find时,第二个参数传入命名空间字典,XPath表达式中通过ns:前缀指定元素所属的命名空间
  3. 遍历目标元素:直接遍历stuRec元素(而非studentData),再通过相对路径定位acctDt和prov字段

运行输出

acctDt: 2023-04-04, prov: AB
acctDt: 2023-05-14, prov: ON

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:34