|
def parse( source )
begin
while not source.empty?
word = source.match( /^\s*(<.*?)>/um )
source.match( /^\s*/um, true )
word = word[1] unless word.nil?
case word
when nil
word = source.match( /\s*(\S+)/um, true )
return if word.nil?
raise ParseException.new( "data found outside of root element (data is '#{word}')", source ) if word[0].strip.length > 0
when Comment::START_RE
self.add( Comment.new( source ) )
when DocType::START_RE
self.add( DocType.new( source ) )
when XMLDecl::START_RE
x = XMLDecl.new( source )
source.encoding = x.encoding
self.add( x )
when Instruction::START_RE
self.add( Instruction.new(source) )
else
Element.new( source, self, @context )
end
end
unless @elements.size == 1
#@children.find_all{|x| puts x if x.kind_of? Element }
raise "the document does not have exactly one root"
end
rescue ParseException
$!.source = source
$!.element = self
raise
rescue Exception
old_ex = $!
raise ParseException.new("unidentified error", source, self, old_ex)
end
end
|