# File lib/plist/parser.rb, line 81
    def parse
      plist_tags = PTag.mappings.keys.join('|')
      start_tag  = /<(#{plist_tags})([^>]*)>/i
      end_tag    = /<\/(#{plist_tags})[^>]*>/i

      require 'strscan'

      @scanner = StringScanner.new(@xml)
      until @scanner.eos?
        if @scanner.scan(COMMENT_START)
          @scanner.scan(COMMENT_END)
        elsif @scanner.scan(XMLDECL_PATTERN)
          encoding = parse_encoding_from_xml_declaration(@scanner[1])
          next if encoding.nil?

          # use the specified encoding for the rest of the file
          next unless String.method_defined?(:force_encoding)
          @scanner.string = @scanner.rest.force_encoding(encoding)
        elsif @scanner.scan(DOCTYPE_PATTERN)
          next
        elsif @scanner.scan(start_tag)
          @listener.tag_start(@scanner[1], nil)
          if (@scanner[2] =~ /\/$/)
            @listener.tag_end(@scanner[1])
          end
        elsif @scanner.scan(TEXT)
          @listener.text(@scanner[1])
        elsif @scanner.scan(end_tag)
          @listener.tag_end(@scanner[1])
        else
          raise "Unimplemented element"
        end
      end
    end