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

如何用Python ElementTree获取XML中OptnOnSpotAndFutrsInf节点并提取文本

解决带命名空间的XML节点查找问题

你的问题根源在于XML文件包含命名空间,而你直接使用节点名称查找时没有考虑这一点,所以iter()方法找不到对应的节点。下面是具体的解决方案:

方法1:使用完整的命名空间限定节点名

首先你需要从XML文件的根节点属性里获取实际的命名空间(通常格式为xmlns="http://xxx.xxx/xxx"),然后将命名空间和节点名组合起来进行查找:

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

# 替换成你XML文件中的真实命名空间地址
namespace = '{http://your-actual-namespace-url}'

# 查找带命名空间的目标节点
for e in root.iter(namespace + 'OptnOnSpotAndFutrsInf'):
    # 提取TckrSymb和CFICd的文本内容
    tckr_symb = e.find(namespace + 'TckrSymb').text
    cfi_cd = e.find(namespace + 'CFICd').text
    print(f"TckrSymb: {tckr_symb}, CFICd: {cfi_cd}")

方法2:注册命名空间前缀,简化查找

如果觉得每次写完整命名空间太繁琐,可以注册一个自定义前缀,之后用前缀+节点名的格式来查找:

import xml.etree.ElementTree as ET

# 注册命名空间前缀,这里的'ns'可以换成你喜欢的任意前缀
ET.register_namespace('ns', 'http://your-actual-namespace-url')

tree = ET.parse('file.xml')
root = tree.getroot()

# 使用前缀+节点名查找目标节点
for e in root.iter('ns:OptnOnSpotAndFutrsInf'):
    tckr_symb = e.find('ns:TckrSymb').text
    cfi_cd = e.find('ns:CFICd').text
    print(f"TckrSymb: {tckr_symb}, CFICd: {cfi_cd}")

方法3:忽略命名空间,匹配本地节点名(应急可用)

如果你不确定具体命名空间,或者不想处理命名空间逻辑,可以遍历所有节点,通过节点的本地名称来筛选(不推荐用于复杂XML,可能误匹配):

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import QName

tree = ET.parse('file.xml')
root = tree.getroot()

for e in root.iter():
    # 获取去掉命名空间后的节点本地名称
    if QName(e.tag).localName == 'OptnOnSpotAndFutrsInf':
        tckr_symb = e.find('.//*[local-name()="TckrSymb"]').text
        cfi_cd = e.find('.//*[local-name()="CFICd"]').text
        print(f"TckrSymb: {tckr_symb}, CFICd: {cfi_cd}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:49