JDE E1 Orchestrator:JRuby解析ECB汇率XML转JSON报错求助
解决JRuby解析ECB汇率XML转JSON的问题
ECB每日汇率XML自带命名空间,这是修改元素定位后报错的核心原因,以下是适配JDE E1 Orchestrator的完整解决方案:
可行的JRuby代码示例
require 'nokogiri' require 'json' # 读取XML内容(若通过Orchestrator HTTP节点获取,直接传入返回内容即可) xml_content = open('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml').read # 解析XML并绑定命名空间 doc = Nokogiri::XML(xml_content) ns_map = {'efx' => 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'} # 提取汇率日期与具体数据 exchange_date = doc.xpath('//efx:Cube[@time]', ns_map).first['time'] rate_list = [] doc.xpath('//efx:Cube[@time]/efx:Cube', ns_map).each do |rate_node| rate_list << { 'currency' => rate_node['currency'], 'rate' => rate_node['rate'].to_f } end # 构造最终JSON结构 output_json = { 'data_source' => 'ECB', 'exchange_date' => exchange_date, 'base_currency' => 'EUR', 'rates' => rate_list } # 输出JSON(适配Orchestrator输出要求,可替换为赋值给指定输出变量) puts JSON.pretty_generate(output_json)
常见报错原因与修复
- 未处理命名空间:直接用
//Cube定位元素会导致Nokogiri无法匹配,出现undefined method [] for nil:NilClass错误。必须通过命名空间映射(ns_map)在XPath查询中指定前缀。 - 层级定位错误:汇率节点是日期节点的子元素,若用
//efx:Cube[@currency]模糊定位,可能匹配到无关节点,需用//efx:Cube[@time]/efx:Cube精准定位层级。 - 类型转换异常:若XML中
rate值为空或格式异常,to_f会报错,可修改为rate_node['rate'] ? rate_node['rate'].to_f : nil做容错处理。
JDE E1 Orchestrator适配提示
- 若通过Orchestrator的HTTP节点获取XML,直接将节点返回的XML内容传入JRuby脚本,无需使用
open方法避免权限问题。 - 可将
output_json赋值给Orchestrator的输出变量,而非直接puts,确保数据能被后续节点读取。
内容的提问来源于stack exchange,提问作者JDE
相关产品推荐
相关产品推荐

