Module: WikiAvro::XML

Defined in:
lib/wikiavro/xml.rb

Overview

Parser functions will assume to possibly start on their opening tag, and stop parsing right after their end tag. There’re probably loads of bugs waiting for when you nest tags of the same name.

Defined Under Namespace

Classes: Element, Group, Inserter, Leaf, MissingElement, Stream, TooFewElements, TooManyElements

Class Method Summary collapse

Class Method Details

.exit_tag(writer, reader, name) ⇒ Object

Do not call this while you are on the opening tag



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/wikiavro/xml.rb', line 27

def self.exit_tag(writer, reader, name)
  nest = 1

#    puts "exit_tag: exiting #{name}"

  loop do
    case reader.node_type
    when XML::Reader::TYPE_ELEMENT
#        puts "exit_tag: entered #{reader.name}"
      writer.skipped(reader.name)
      nest += 1 if reader.name == name
    when XML::Reader::TYPE_END_ELEMENT
#        puts "exit_tag: exited #{reader.name}"
      nest -= 1 if reader.name == name
    end
    reader.read
    if nest == 0
#        puts "exit_tag: successful exit, now at #{reader.name}"
      break
    end
  end
end

.skip_tag(writer, reader, skipping) ⇒ Object

Call this to skip when reader is on the opening tag



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/wikiavro/xml.rb', line 51

def self.skip_tag(writer, reader, skipping)
  nest = 1
  name = reader.name

#    puts "skip_tag: skipping #{name}"

  if reader.empty_element?
#      puts "skip_tag: element was empty; skipped"
    writer.skipped(name) if skipping
    reader.read
    return
  end

  while reader.read
    case reader.node_type
    when XML::Reader::TYPE_ELEMENT
#        puts "skip_tag: entered #{reader.name}"
      writer.skipped(reader.name) if skipping
      nest += 1 if reader.name == name
    when XML::Reader::TYPE_END_ELEMENT
#        puts "skip_tag: exited #{reader.name}"
      nest -= 1 if reader.name == name
    end
    if nest == 0
      reader.read
      break
    end
  end
end

.to_element(writer, reader, name) ⇒ Object

Raises:



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/wikiavro/xml.rb', line 84

def self.to_element(writer, reader, name)
  while WikiAvro::XML::to_tag(reader)
#      puts "to_element: saw #{reader.name}"
    if reader.name == name
      return
    else
#        puts "to_element: skipping #{reader.name}"
      WikiAvro::XML.skip_tag(writer, reader, true)
#        puts "to_element: skipped"
    end

    break if !reader.read
  end

  raise MissingElement.new(name)
end

.to_tag(reader) ⇒ Object

Raises:

  • (EOFError)


6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/wikiavro/xml.rb', line 6

def self.to_tag(reader)
#    puts 'to_tag: moving to tag'
  loop do
    case reader.node_type
    when XML::Reader::TYPE_ELEMENT
#        puts "to_tag: got tag #{reader.name}"
      return true
    when XML::Reader::TYPE_END_ELEMENT
#        puts "to_tag: got end tag #{reader.name}"
      return false
    end

    break if !reader.read
  end

  # XML::Reader will probably raise its own exception before we ever
  # could get here
  raise EOFError.new('no opening tag')
end