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

