我有一个简单但巨大的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
代码?
答案 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>
标记时会停止。