如何使用Nokogiri解析XML并分割节点值?

问题描述:

我正在使用Nokogiri来解析XML。如何使用Nokogiri解析XML并分割节点值?

doc = Nokogiri::XML("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php") 

我不确定如何正确检索节点值。

我在title,linkdescription之后,特别是位于item父节点下的节点。

<item> 
    <title>Toasted TV - TEN - 07:00:00 - 21/12/2011</title> 
    <link>http://www.enhancetv.com.au/tvguide/</link> 
    <description>Join the team for the latest in gaming, sport, gadgets, pop culture, movies, music and other seriously fun stuff! Featuring a variety of your favourite cartoons.</description> 
</item> 

我想什么做的是这样的,我可以的日期和时间字符串转换成一个有效DateTime对象以后使用在轨道下的方式title.split("-")

由于这是一个RSS feed,你可能要考虑一个RSS解析器:

require 'simple-rss' 
require 'open-uri' 

feed = 'http://www.enhancetv.com.au/tvguide/rss/melbournerss.php' 
rss = SimpleRSS.parse open(feed) 

rss.items.each do |item| 
    puts item.title, item.link, item.description 
end 

def parse_time(text) 
    items = text.split("-") 
    DateTime.strptime("#{items[-2].strip}#{items[-1].strip}", "%H:%M:%S%d/%m/%Y") 
end 

content = Net::HTTP.get(URI.parse("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php")) 
doc = Nokogiri::XML(content){|config| config.noblanks } 

doc.search("//item").map{ |node| 
    node.children.inject({}) do |hash, node| 
    if node.name == "title" 
     #or another name 
     hash["created_at"] = parse_time(node.text) 
    end 

    hash[node.name] = node.text 
    hash 
    end 
} 
+0

嗯,我将如何进一步检索描述,链接等? – fuzz 2011-12-21 02:31:58

+0

此代码仅显示如何提取'

'节点,但我实际上还需要其余节点。理想情况下,我想将所有值存储在一个对象中以供稍后使用。 – fuzz 2011-12-21 02:46:17

你提到的例子标题字符串:

DateTime.parse(s.split(" - ")[-2..-1].join(" ")) 

这让你一个DateTime对象:Wed, 21 Dec 2011 07:00:00 +0000

但你必须留意,你可能需要处理标题的变化用。修改分割点以满足您的需求。

更新:没有注意到你也想要更多关于如何解析文档的信息。所以这里是如何:

doc = Nokogiri::XML(open("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php")) 
data = doc.xpath("//item").map do |item| 
    [ 
    item.search("title").first.content, 
    item.search("link").first.content, 
    item.search("description").first.content 
    ] 
end 

这将加载数据数组中的项目的所有标题,链接和描述。 Nokogiri :: XML接受一个字符串作为xml文档内容,所以你需要打开url然后将结果提供给它。

+1

使用'item.at(“title”)。content'而不是'item.search(“title”)。first.content'。 'at'意思是“得到初审” – 2012-01-06 08:30:06