Class: Nokogireader::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/nokogireader/reader.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.element(name, opts = {}, &block) ⇒ Object



7
8
9
10
11
# File 'lib/nokogireader/reader.rb', line 7

def self.element(name, opts = {}, &block)
  root_definition.configure do
    element(name, opts, &block)
  end
end

.elements(name, opts = {}, &block) ⇒ Object



13
14
15
16
17
# File 'lib/nokogireader/reader.rb', line 13

def self.elements(name, opts = {}, &block)
  root_definition.configure do
    elements(name, opts, &block)
  end
end

.root_definitionObject



3
4
5
# File 'lib/nokogireader/reader.rb', line 3

def self.root_definition
  @root ||= Definition.new
end

Instance Method Details

#read(xml) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/nokogireader/reader.rb', line 19

def read(xml)
  root = self.class.root_definition
  defstack = []
  data = ReadData.new(nil, root, nil)

  build_xml_reader(xml).each do |n|
    if n.node_type == 1
      d = defstack.last || root
      defstack << (d.accept?(n) ? d.children[n.name] : nil)
      data = data.add_child(defstack.last, n) if defstack.last
    elsif n.node_type == 3
      data.text = n.value if defstack.last && defstack.last.accept?(n)
    end

    if (n.node_type == 15 || n.self_closing?) && (old_def = defstack.pop)
      old_def.on_traversed(self, data)
      data = data.parent 
      data.clear_child_for(n) if old_def.dont_store_data
    end
  end

  data
end