如何在nokogiri中使用SAX解析XML时搜索XML

时间:2010-12-27 01:45:06

标签: ruby nokogiri sax

我有一个简单但巨大的xml文件,如下所示。我想使用SAX解析它,只打印title标记之间的文本。

<root>
    <site>some site</site>
    <title>good title</title>
</root>

我有以下代码:

require 'rubygems'
require 'nokogiri'
include Nokogiri

class PostCallbacks < XML::SAX::Document
  def start_element(element, attributes)
    if element == 'title'
      puts "found title"
    end
  end

  def characters(text)
    puts text
  end
end

parser = XML::SAX::Parser.new(PostCallbacks.new)
parser.parse_file("myfile.xml")

问题是它在所有标签之间打印文本。如何在title代码?

之间打印文字

2 个答案:

答案 0 :(得分:8)

您只需要跟踪<title>内的时间,以便characters知道何时应该注意。这样的事情(未经测试的代码)或许:

class PostCallbacks < XML::SAX::Document
  def initialize
    @in_title = false
  end

  def start_element(element, attributes)
    if element == 'title'
      puts "found title"
      @in_title = true
    end
  end

  def end_element(element)
    # Doesn't really matter what element we're closing unless there is nesting,
    # then you'd want "@in_title = false if element == 'title'"
    @in_title = false
  end

  def characters(text)
    puts text if @in_title
  end
end

答案 1 :(得分:1)

上面接受的答案是正确的,但它有一个缺点,即即使它在开头找到<title>,它也会遍历整个XML文件。

我确实有类似的需求,最后我写了一个saxy红宝石宝石,目的是在这种情况下有效。在引擎盖下,它实现了Nokogiri的SAX Api。

以下是您使用它的方式:

require 'saxy'
title = Saxy.parse(path_to_your_file, 'title').first

当它第一次出现<title>标记时会停止。