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

