首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在解析XPath时,如何使Nokogiri解析引用?

在解析XPath时,如何使Nokogiri解析引用?
EN

Stack Overflow用户
提问于 2011-01-29 11:07:24
回答 2查看 1.3K关注 0票数 1

在使用XPath读取XML方面已经写了很多关于Nokogiri的文章。但是,如何在包含XPath引用的XML中使用Nokogiri。

在本例中,xml包含一个XPath引用:

代码语言:javascript
运行
复制
<elements>
 <element>
  <location>
   <longitude>...
   <latitude>...
  </location>
 </element>
 <element>
  <location reference="../../element/location"/>
 </element>
</elements>

因为这两个位置元素是相等的,所以只详细描述了第一个元素。第二个只是引用了第一个。

使用Nokogiri,xml.xpath('//location')按预期返回两个节点实例。第一个节点包含所有子节点。第二个仅作为第二个节点实例的属性的引用。

好的,假设我想请求所有经度值,我将执行xml.xpath('//location/longitude').这只返回一个节点实例。但是,由于实际上有两个类型为“经度”的元素,我希望接收两个节点实例,期望Nokogiri解析XPath引用.

我如何通过Nokogiri实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-29 19:07:40

您可以收集具有实际值的位置节点(非引用节点),然后单独收集所有引用,如下所示:

代码语言:javascript
运行
复制
require 'nokogiri'

xml = <<End
<elements>
 <element>
  <location>
   <longitude>45</longitude>
   <latitude>-70</latitude>
  </location>
 </element>
 <element>
  <location reference="../../element/location"/>
 </element>
</element>
End

doc = Nokogiri::XML(xml)

#Collect all the explicit longitudes
longitudes = doc.search('//location[not(@reference)]/longitude').map(&:text)

#Follow references to longitudes
doc.search('//location[@reference]').each do |location|
  reference = location.attribute('reference')
  longitudes << location.xpath("#{reference}/longitude").text
end

puts longitudes #=> ["45", "45"]

您可以在此技术基础上提取任何您想要的信息。

票数 1
EN

Stack Overflow用户

发布于 2011-01-29 17:46:17

您还没有提供任何线索,第二个location 元素如何引用第一个.

即使这个机制是已知的longitude,并且我们能够在XPath表达式中指定它来选择引用的location元素,选择的两个location节点将是相同的

当计算一个XPath表达式时,它总是返回一组节点--也就是说,如果同一个节点不止一次在选择结果中被表示一次--一个集合不包含重复的项。

这就是为什么longitude元素在选择中只显示一次的原因,即使它被选中了两次。

这里是一个例子,

代码语言:javascript
运行
复制
<a>
 <b>
   <c/>
 </b>
</a>

XPath表达式

/a/* x/c/.

只选择一个元素 b --而不是两个相同的元素b

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4836521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档