# File lib/facter/util/plist/parser.rb, line 73
 73:     def parse
 74:       plist_tags = PTag::mappings.keys.join('|')
 75:       start_tag  = /<(#{plist_tags})([^>]*)>/i
 76:       end_tag  = /<\/(#{plist_tags})[^>]*>/i
 77: 
 78:       require 'strscan'
 79: 
 80:       contents = (
 81:         if (File.exists? @filename_or_xml)
 82:           File.open(@filename_or_xml) {|f| f.read}
 83:         else
 84:           @filename_or_xml
 85:         end
 86:       )
 87: 
 88:       @scanner = StringScanner.new( contents )
 89:       until @scanner.eos?
 90:         if @scanner.scan(COMMENT_START)
 91:           @scanner.scan(COMMENT_END)
 92:         elsif @scanner.scan(XMLDECL_PATTERN)
 93:         elsif @scanner.scan(DOCTYPE_PATTERN)
 94:         elsif @scanner.scan(start_tag)
 95:           @listener.tag_start(@scanner[1], nil)
 96:           if (@scanner[2] =~ /\/$/)
 97:             @listener.tag_end(@scanner[1])
 98:           end
 99:         elsif @scanner.scan(TEXT)
100:           @listener.text(@scanner[1])
101:         elsif @scanner.scan(end_tag)
102:           @listener.tag_end(@scanner[1])
103:         else
104:           raise "Unimplemented element"
105:         end
106:       end
107:     end