VB.NET/C#中获取XMLElement子元素异常:ECB汇率XML接口子节点缺失
解决ECB汇率XML接口子节点不显示的问题
嘿,我碰到过好几个开发者踩这个ECB汇率XML的坑,核心问题几乎都是命名空间处理不当!先给你拆解下这个XML的结构关键点:
这个XML里有两个命名空间:
gesmes:前缀对应的是http://www.gesmes.org/xml/2002-08-01,用来包裹信封结构(比如<gesmes:Envelope>、<gesmes:subject>)- 还有一个默认命名空间:
http://www.ecb.int/vocabulary/2002-08-01/eurofxref,所有实际的汇率数据节点(比如嵌套的<Cube>)都属于这个命名空间
你说子节点没显示,大概率是直接用节点的本地名称(比如<Cube>)去查找,而没有指定它所属的默认命名空间——XML解析器会把带命名空间的节点视为完全不同的元素,自然找不到。
举个Python的实际处理例子,帮你理解怎么正确查找:
import xml.etree.ElementTree as ET # 先注册命名空间,给默认命名空间分配一个前缀(比如ecb) ET.register_namespace('', 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref') ET.register_namespace('gesmes', 'http://www.gesmes.org/xml/2002-08-01') # 加载XML(这里也可以直接从URL获取) tree = ET.parse('eurofxref-daily.xml') root = tree.getroot() # 查找所有带currency属性的Cube节点,必须指定命名空间 for rate_cube in root.findall('.//ecb:Cube[@currency]', namespaces={'ecb': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'}): print(f"货币: {rate_cube.get('currency')}, 汇率: {rate_cube.get('rate')}")
如果是用其他语言(比如Java、C#),思路也是一样的:必须通过命名空间URI + 本地节点名的组合来定位元素,不能只写本地名称。比如Java的DOM解析里,要用getElementsByTagNameNS()而不是getElementsByTagName()。
再核对下你的代码:如果是直接写类似root.find('Cube')这种,肯定找不到——因为这个<Cube>属于默认的eurofxref命名空间,不是无命名空间的节点。
内容的提问来源于stack exchange,提问作者Takeru Nakajima
相关产品推荐
相关产品推荐

