class Nokogiri::Streaming::Reader
Public Class Methods
new(source, encoding: 'utf-8')
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 10 def initialize(source, encoding: 'utf-8') @source = IOWrapper.new(source) @parser = Nokogiri::XML::SAX::Parser.new(self, encoding) @stack = [] @end_triggers = {} @start_triggers = {} end
Public Instance Methods
cdata_block(string)
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 103 def cdata_block(string) if @current @current.add_child(@current.document.create_cdata(string)) end end
characters(string)
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 97 def characters(string) if @current @current.add_child(string) end end
current_path()
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 30 def current_path if @stack.any? '/' + @stack.join('/') else '' end end
end_document()
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 49 def end_document end
end_element(name)
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 80 def end_element(name) path = current_path @stack.pop element = @current if @current @current = @current.parent end if (triggers = @end_triggers[path]) triggers.each do |proc| proc.call(element) end end end
error(message)
click to toggle source
The following methods are SAX callbacks from Nokogiri
.
# File lib/nokogiri/streaming/reader.rb, line 42 def error(message) if @source.exception raise @source.exception end raise ParseError.new(message) end
on(path, &block)
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 22 def on(path, &block) (@end_triggers[path] ||= []).push(block) end
on_start(path, &block)
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 26 def on_start(path, &block) (@start_triggers[path] ||= []).push(block) end
run()
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 18 def run @parser.parse(@source) end
start_element(name, attrs = [])
click to toggle source
# File lib/nokogiri/streaming/reader.rb, line 52 def start_element(name, attrs = []) if @current element = @current.document.create_element(name) attrs.each do |attrname, value| element[attrname] = value end @current.add_child(element) @current = element elsif @end_triggers.include?(current_path + '/' + name) fragment = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new) element = fragment.document.create_element(name) attrs.each do |attrname, value| element[attrname] = value end @current = element elsif (triggers = @start_triggers[current_path + '/' + name]) fragment = Nokogiri::XML::DocumentFragment.new(Nokogiri::XML::Document.new) element = fragment.document.create_element(name) attrs.each do |attrname, value| element[attrname] = value end triggers.each do |proc| proc.call(element) end end @stack.push(name) end