1340: def parseparseparseparseparse
1341: @started = false
1342: begin
1343: parser = REXML::Parsers::SAX2Parser.new @stream
1344: parser.listen( :start_element ) do |uri, localname, qname, attributes|
1345: case qname
1346: when "stream:stream"
1347: openstream = ParsedXMLElement.new(qname)
1348: attributes.each { |attr, value| openstream.add_attribute(attr, value) }
1349: @listener.receive(openstream)
1350: @started = true
1351: else
1352: if @current.nil?
1353: @current = ParsedXMLElement.new(qname)
1354: else
1355: @current = @current.add_child(qname)
1356: end
1357: attributes.each { |attr, value| @current.add_attribute(attr, value) }
1358: end
1359: end
1360: parser.listen( :end_element ) do |uri, localname, qname|
1361: case qname
1362: when "stream:stream"
1363: @started = false
1364: else
1365: @listener.receive(@current) unless @current.element_parent
1366: @current = @current.element_parent
1367: end
1368: end
1369: parser.listen( :characters ) do | text |
1370: @current.append_data(text) if @current
1371: end
1372: parser.listen( :cdata ) do | text |
1373: @current.append_data(text) if @current
1374: end
1375: parser.parse
1376: rescue REXML::ParseException
1377: @listener.parse_failure
1378: end
1379: end