Ruby:提取并操作部分提取的Nokogiri对象

时间:2015-02-09 06:22:59

标签: ruby xpath nokogiri

require 'nokogiri'

xml = DATA.read
xml_nokogiri = Nokogiri::XML.parse xml

widgets = xml_nokogiri.xpath("//Widget")
dates = widgets.map { |widget| widget.xpath("//DateAdded").text }

puts dates

__END__
<Widgets>
  <Widget>
    <Price>42</Price>
    <DateAdded>04/22/1989</DateAdded>
  </Widget>
  <Widget>
    <Price>29</Price>
    <DateAdded>02/05/2015</DateAdded>
  </Widget>
</Widgets>

备注

  1. 这是一个人为的例子我因为依赖太多而发布实际代码非常不方便。这个代码是否可以在复制/粘贴时轻松测试。
  2. 小部件Nokogiri::XML::NodeSet个对象,有两个Nokogiri::XML::Element个。其中每个都是与 Widget 标记对应的xml片段。
  3. 我打算再次使用xpath 对每个片段进行操作,但使用以xpath开头的//查询似乎是从 ROOT查询xml AGAIN 不是单个片段。
  4. 知道为什么会这样吗?期待日期单独保存每个片段的标签
  5. 编辑:假设代码具有复杂的结构 相对寻址是不实际的(比如使用 xpath("DateAdded")

1 个答案:

答案 0 :(得分:3)

.//DateAdded将为您提供相对的 XPath (任何嵌套的DateAdded节点),以及没有前面斜杠的简单DateAdded(直接子节点):

- dates = widgets.map { |widget| widget.xpath("//DateAdded").text }

# for immediate children use 'DateAdded'
+ dates = widgets.map { |widget| widget.xpath("DateAdded").text }

# for nested elements use './/DateAdded'
+ dates = widgets.map { |widget| widget.xpath(".//DateAdded").text }

#⇒ [
#  [0] "04/22/1989",
#  [1] "02/05/2015"
#]