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

如何用Ruby-Nokogiri按双条件查询XML的ObsValue值?

问题解决:基于Nokogiri匹配XML节点获取对应值

给定XML内容

<generic:Obs>
  <generic:ObsKey>
    <generic:Value id="TIME_PERIOD" value="2020"/>
    <generic:Value id="SPECIFICATION" value="SSL05"/>
    <generic:Value id="MONTH" value="A02"/>
    <generic:Value id="FREQ" value="A"/>
  </generic:ObsKey>
  <generic:ObsValue value="100.56"/>
  <generic:Attributes>
    <generic:Value id="NOTE_SPECIFICATION_2" value="SSL05"/>
    <generic:Value id="DECIMALS" value="2"/>
  </generic:Attributes>
</generic:Obs>

需求说明

从<generic:Obs>节点组中,当其中的<generic:Value id="TIME_PERIOD" value="2020"/>和<generic:Value id="MONTH" value="A02"/>同时匹配时,获取对应的<generic:ObsValue>的value属性值。

当前代码尝试

doc = Nokogiri::XML(URI.open("https://xml.de"))
@ObsValue = doc.xpath('//obs//obskey/@id="TIME_PERIOD"')..... 

解决方案

你的代码问题主要在于没处理XML命名空间,且XPath逻辑不完整。以下是完整可行的代码:

require 'nokogiri'
require 'open-uri'

# 加载XML文档
doc = Nokogiri::XML(URI.open("https://xml.de"))

# 注册命名空间(XML中generic前缀对应实际命名空间URI,从文档根节点获取)
namespaces = {'generic' => doc.root.namespaces['xmlns:generic']}

# 用XPath筛选符合条件的Obs节点,提取对应ObsValue的value属性
target_value = doc.xpath(
  '//generic:Obs[
    generic:ObsKey/generic:Value[@id="TIME_PERIOD" and @value="2020"] 
    and 
    generic:ObsKey/generic:Value[@id="MONTH" and @value="A02"]
  ]/generic:ObsValue/@value',
  namespaces
).to_s

puts target_value # 输出结果:100.56

关键点说明

  • 命名空间处理:XML节点带generic:前缀,必须注册对应命名空间才能让Nokogiri正确识别节点,否则查询会失败。
  • XPath逻辑:先定位同时包含两个指定<generic:Value>节点的<generic:Obs>,再直接提取其下<generic:ObsValue>的value属性,一步到位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:00:58