如何使用Nokogiri解析XML文件?

我和Nokogiri有些问题。

我试图解析这个XML文件:

 A Funfair in Bangkok Funfair in Bangkok True A small funfair near On Nut in Bangkok. 2009-08-03T00:00:00 False   Funfair in Bangkok A small funfair near On Nut in Bangkok. Anthony Bouch Copyright © Anthony Bouch 2009-08-07T19:22:08  Funfair Bangkok Thailand       Bumper Cars at a Funfair in Bangkok Bumper cars at a small funfair near On Nut in Bangkok. Anthony Bouch Copyright © Anthony Bouch 2009-08-03T22:08:24  Bumper Cars Funfair Bangkok Thailand        

我希望所有这些信息都显示在屏幕上,就是这样。 应该简单吧? 我这样做:

 require 'nokogiri' doc = Nokogiri::XML(File.open("sample.xml")) @block = doc.css("items item").map {|node| node.children.text} puts @block 

每个Items都是一个节点,在它下面有Item子节点?

我创建了一个这样的地图,它返回一个哈希值, {}的代码遍历每个节点并将子文本放入@block 。 然后我可以将所有子节点的文本显示到屏幕上。

我不知道我有多远或多近,因为我读了很多文章,而且我对基础知识仍然有点困惑,特别是因为通常使用新语言,我从文件中读取并输出到屏幕上以获得基本知识程序。

在这里,我将尝试向您解释您遇到的所有问题/困惑:

 require 'nokogiri' doc = Nokogiri::XML.parse <<-XML  A Funfair in Bangkok Funfair in Bangkok True A small funfair near On Nut in Bangkok. 2009-08-03T00:00:00 False   Funfair in Bangkok A small funfair near On Nut in Bangkok. Anthony Bouch Copyright © Anthony Bouch 2009-08-07T19:22:08  Funfair Bangkok Thailand       Bumper Cars at a Funfair in Bangkok Bumper cars at a small funfair near On Nut in Bangkok. Anthony Bouch Copyright © Anthony Bouch 2009-08-03T22:08:24  Bumper Cars Funfair Bangkok Thailand        XML 

因此,根据我对Nokogiri的理解,每个’Items’都是一个节点,并且在那之下有’Item’的子节点?

不,每个项目都是Nokogiri::XML::NodeSet 。 在那之下,有2 Nokogiri::XML::Element节点的Items ,它们是Nokogiri::XML::Element类对象。 你也可以说它们也是Nokogiri::XML::Node

 doc.class # => Nokogiri::XML::Document @block = doc.xpath("//Items/Item") @block.class # => Nokogiri::XML::NodeSet @block.count # => 2 @block.map { |node| node.name } # => ["Item", "Item"] @block.map { |node| node.class } # => [Nokogiri::XML::Element, Nokogiri::XML::Element] @block.map { |node| node.children.count } # => [19, 19] @block.map { |node| node.class.superclass } # => [Nokogiri::XML::Node, Nokogiri::XML::Node] 

我们创建了一个这样的地图,它返回一个我认为的哈希,{}中的代码遍历每个节点并将子文本放入@block。 然后我可以将所有这个子节点的文本显示在屏幕上。

我不明白这一点。 虽然我试图在下面解释什么是Node ,以及Nokogiri中的Nodeset是什么。 记住NodesetNodeset的集合。

 @chld_class = @block.map do |node| node.children.class end @chld_class # => [Nokogiri::XML::NodeSet, Nokogiri::XML::NodeSet] @chld_name = @block.map do |node| node.children.map { |n| [n.name,n.class] } end @chld_name # => [[["text", Nokogiri::XML::Text], # ["Title", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Caption", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Authors", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Copyright", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["CreatedDate", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Keywords", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["ThumbnailSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["PreviewSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["OriginalSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text]], # [["text", Nokogiri::XML::Text], # ["Title", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Caption", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Authors", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Copyright", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["CreatedDate", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["Keywords", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["ThumbnailSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["PreviewSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text], # ["OriginalSize", Nokogiri::XML::Element], # ["text", Nokogiri::XML::Text]]] 

 @chld_name = @block.map do |node| node.children.map{|n| [n.name,n.text.strip] if n.elem? }.compact end.compact @chld_name # => [[["Title", "Funfair in Bangkok"], # ["Caption", "A small funfair near On Nut in Bangkok."], # ["Authors", "Anthony Bouch"], # ["Copyright", "Copyright © Anthony Bouch"], # ["CreatedDate", "2009-08-07T19:22:08"], # ["Keywords", "Funfair\n Bangkok\n Thailand"], # ["ThumbnailSize", ""], # ["PreviewSize", ""], # ["OriginalSize", ""]], # [["Title", "Bumper Cars at a Funfair in Bangkok"], # ["Caption", "Bumper cars at a small funfair near On Nut in Bangkok."], # ["Authors", "Anthony Bouch"], # ["Copyright", "Copyright © Anthony Bouch"], # ["CreatedDate", "2009-08-03T22:08:24"], # ["Keywords", # "Bumper Cars\n Funfair\n Bangkok\n Thailand"], # ["ThumbnailSize", ""], # ["PreviewSize", ""], # ["OriginalSize", ""]]] 

示例XML中的节点是大写的,因此您的代码应该反映出来。 例如:

 require 'nokogiri' doc = Nokogiri::XML(File.open("sample.xml")) @block = doc.css("Items Item").map { |node| node.children.text } puts @block