Ruby:对部分提取的Nokogiri对象进行提取和操作

Ruby: Extract and operate on partially extracted Nokogiri objects

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. 这是我编造的一个人为示例,因为它对 post 实际代码非常不方便,因为依赖项太多。这样做是因为这段代码很容易在 copy/paste.
  2. 上测试
  3. widgets 是一个 Nokogiri::XML::NodeSet 对象,它有两个 Nokogiri::XML::Element。其中每一个都是对应Widget标签的xml片段。
  4. 我打算再次使用 xpath 对这些片段中的每一个进行操作,但是使用以 // 开头的 xpath 查询似乎查询来自 xml AGAINROOT 不是单个片段。
  5. 知道为什么会这样吗?期望 dates 单独保存每个片段的标签
  6. EDIT:假设标签有一个复杂的结构 相对寻址不切实际(比如使用 xpath("DateAdded"))

.//DateAdded 会给你相对的 XPath (任何嵌套的 DateAdded 节点),以及简单的 DateAdded 没有前面的斜杠(直接child):

- 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"
#]