Line | |
---|
1 | require 'rexml/parsers/streamparser'
|
---|
2 | require 'rexml/parsers/baseparser'
|
---|
3 |
|
---|
4 | module REXML
|
---|
5 | module Parsers
|
---|
6 | class UltraLightParser
|
---|
7 | def initialize stream
|
---|
8 | @stream = stream
|
---|
9 | @parser = REXML::Parsers::BaseParser.new( stream )
|
---|
10 | end
|
---|
11 |
|
---|
12 | def add_listener( listener )
|
---|
13 | @parser.add_listener( listener )
|
---|
14 | end
|
---|
15 |
|
---|
16 | def rewind
|
---|
17 | @stream.rewind
|
---|
18 | @parser.stream = @stream
|
---|
19 | end
|
---|
20 |
|
---|
21 | def parse
|
---|
22 | root = context = []
|
---|
23 | while true
|
---|
24 | event = @parser.pull
|
---|
25 | case event[0]
|
---|
26 | when :end_document
|
---|
27 | break
|
---|
28 | when :end_doctype
|
---|
29 | context = context[1]
|
---|
30 | when :start_element, :doctype
|
---|
31 | context << event
|
---|
32 | event[1,0] = [context]
|
---|
33 | context = event
|
---|
34 | when :end_element
|
---|
35 | context = context[1]
|
---|
36 | else
|
---|
37 | context << event
|
---|
38 | end
|
---|
39 | end
|
---|
40 | root
|
---|
41 | end
|
---|
42 | end
|
---|
43 |
|
---|
44 | # An element is an array. The array contains:
|
---|
45 | # 0 The parent element
|
---|
46 | # 1 The tag name
|
---|
47 | # 2 A hash of attributes
|
---|
48 | # 3..-1 The child elements
|
---|
49 | # An element is an array of size > 3
|
---|
50 | # Text is a String
|
---|
51 | # PIs are [ :processing_instruction, target, data ]
|
---|
52 | # Comments are [ :comment, data ]
|
---|
53 | # DocTypes are DocType structs
|
---|
54 | # The root is an array with XMLDecls, Text, DocType, Array, Text
|
---|
55 | end
|
---|
56 | end
|
---|
Note:
See
TracBrowser
for help on using the repository browser.