Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用Nokogiri::XML::Reader解析大型XML文件?_Ruby_Xml_Parsing_Nokogiri - Fatal编程技术网

Ruby 如何使用Nokogiri::XML::Reader解析大型XML文件?

Ruby 如何使用Nokogiri::XML::Reader解析大型XML文件?,ruby,xml,parsing,nokogiri,Ruby,Xml,Parsing,Nokogiri,我试图使用Ruby的Nokogiri解析大型(1GB或更多)XML文件。我正在一个较小的文件上测试代码,该文件只包含4条记录。我正在Ubuntu 10.10上使用Nokogiri 1.5.0版和Ruby 1.8.7版。因为我不太理解SAX,所以我尝试从Nokogiri::XML::Reader开始 我的第一次尝试是检索PMID标记的内容,如下所示: #!/usr/bin/ruby require "rubygems" require "nokogiri" file = ARGV[0] re

我试图使用Ruby的Nokogiri解析大型(1GB或更多)XML文件。我正在一个较小的文件上测试代码,该文件只包含4条记录。我正在Ubuntu 10.10上使用Nokogiri 1.5.0版和Ruby 1.8.7版。因为我不太理解SAX,所以我尝试从Nokogiri::XML::Reader开始

我的第一次尝试是检索PMID标记的内容,如下所示:

#!/usr/bin/ruby
require "rubygems"
require "nokogiri"

file   = ARGV[0]
reader = Nokogiri::XML::Reader(File.open(file))
p      = []
reader.each do |node|
  if node.name == "PMID"
    p << node.inner_xml
  end
end

puts p.inspect
reader.each do |node|
  if node.name == "PMID" && node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
    p << node.inner_xml
  end
end
以下是我实际看到的:

["21714156", "", "21693734", "", "21692271", "", "21692260", ""]
似乎出于某种原因,我的代码正在为PMID的每个实例查找或生成一个额外的空PMID标记。这或
内部xml
都不像我想的那样工作


如果有人能确认我的代码和数据生成了显示的结果,并指出我的错误所在,我将不胜感激。

流中的每个元素都作为两个事件来处理:一个打开元素,一个关闭元素。开幕式将有

node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
node.node_type == Nokogiri::XML::Reader::TYPE_END_ELEMENT
而闭幕式将有

node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
node.node_type == Nokogiri::XML::Reader::TYPE_END_ELEMENT
您看到的空字符串只是元素关闭事件。记住,使用SAX解析时,基本上是遍历一棵树,因此需要第二个事件来告诉您何时返回并关闭一个元素

你可能想要更像这样的东西:

#!/usr/bin/ruby
require "rubygems"
require "nokogiri"

file   = ARGV[0]
reader = Nokogiri::XML::Reader(File.open(file))
p      = []
reader.each do |node|
  if node.name == "PMID"
    p << node.inner_xml
  end
end

puts p.inspect
reader.each do |node|
  if node.name == "PMID" && node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
    p << node.inner_xml
  end
end
reader.each do|节点|
如果node.name==“PMID”&&node.node_type==Nokogiri::XML::Reader::type_元素

p在“旧时代”,在我们有很多GB内存的主机之前,我们常常担心加载一两GB的内容。现在,除非有收到一个意外文件的风险,它会消耗所有可用的RAM,否则我会尝试让Nokogiri和Ruby拉入完整大小的文件。是的,1GB是很多文本,但在8GB或16GB的系统上它什么都不是。观察负载和处理时间是否有所改善或受到影响,因为内存分配和垃圾收集会影响速度;在这种情况下,使用SAX模型会有所帮助,但我更喜欢加载它并将其视为DOM。速度比RAM更重要。例如,我尝试在一台96 GB RAM的共享服务器上使用Hpricot(我的首选库)进行解析:72分钟;我经常使用它,但遇到了一些问题,它一直以一种光荣的方式爆发,而Nokogiri没有,所以我换了一个,没有回头看。72分钟的跑步时间似乎很长。您可以尝试运行探查器,看看它是否显示了任何内容。否则,总结代码和XML并将其发布在这里,我们将尝试帮助加快速度。