class Rets::Parser::Compact
Constants
- DEFAULT_DELIMITER
- INCLUDE_NULL_FIELDS
- InvalidDelimiter
Public Class Methods
get_count(xml)
click to toggle source
# File lib/rets/parser/compact.rb, line 106 def self.get_count(xml) doc = Nokogiri.parse(xml.to_s) if node = doc.at("//COUNT") node.attr('Records').to_i else 0 end end
parse(columns, data, delimiter = nil)
click to toggle source
Parses a single row of RETS-COMPACT data.
Delimiter must be a regexp because String#split behaves differently when given a string pattern. (It removes leading spaces).
# File lib/rets/parser/compact.rb, line 71 def self.parse(columns, data, delimiter = nil) delimiter ||= DEFAULT_DELIMITER delimiter = Regexp.new(Regexp.escape(delimiter)) if delimiter == // || delimiter == /,/ raise Rets::Parser::Compact::InvalidDelimiter, "Empty or invalid delimiter found, unable to parse." end column_names = columns.split(delimiter) data_values = data.split(delimiter, INCLUDE_NULL_FIELDS).map do |x| safely_decode_character_references!(x) CGI.unescape_html(x) end zipped_key_values = column_names.zip(data_values).map { |k, v| [k.freeze, v.to_s] } hash = Hash[*zipped_key_values.flatten] hash.reject { |key, value| key.empty? && value.to_s.empty? } end
parse_document(xml)
click to toggle source
# File lib/rets/parser/compact.rb, line 13 def self.parse_document(xml) doc = SaxParser.new parser = Nokogiri::XML::SAX::Parser.new(doc) io = StringIO.new(xml.to_s) parser.parse(io) doc.results.map {|r| parse(doc.columns, r, doc.delimiter) } end
safely_decode_character_references!(string)
click to toggle source
# File lib/rets/parser/compact.rb, line 91 def self.safely_decode_character_references!(string) string.gsub!(/&#(x)?([\h]+);/) do if $2 base = $1 == "x" ? 16 : 10 int = Integer($2, base) begin int.chr(Encoding::UTF_8) rescue RangeError "" end end end string end