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>
备注:
- 这是我编造的一个人为示例,因为它对 post 实际代码非常不方便,因为依赖项太多。这样做是因为这段代码很容易在 copy/paste.
上测试
- widgets 是一个
Nokogiri::XML::NodeSet
对象,它有两个 Nokogiri::XML::Element
。其中每一个都是对应Widget标签的xml片段。
- 我打算再次使用 xpath 对这些片段中的每一个进行操作,但是使用以
//
开头的 xpath
查询似乎查询来自 xml AGAIN 的 ROOT 不是单个片段。
- 知道为什么会这样吗?期望 dates 单独保存每个片段的标签 。
- 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"
#]
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>
备注:
- 这是我编造的一个人为示例,因为它对 post 实际代码非常不方便,因为依赖项太多。这样做是因为这段代码很容易在 copy/paste. 上测试
- widgets 是一个
Nokogiri::XML::NodeSet
对象,它有两个Nokogiri::XML::Element
。其中每一个都是对应Widget标签的xml片段。 - 我打算再次使用 xpath 对这些片段中的每一个进行操作,但是使用以
//
开头的xpath
查询似乎查询来自 xml AGAIN 的 ROOT 不是单个片段。 - 知道为什么会这样吗?期望 dates 单独保存每个片段的标签 。
- 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"
#]