Class: Rets::Parser::Compact
- Inherits:
-
Object
- Object
- Rets::Parser::Compact
- Defined in:
- lib/rets/parser/compact.rb
Defined Under Namespace
Classes: SaxParser
Constant Summary collapse
- DEFAULT_DELIMITER =
"\t"
- INCLUDE_NULL_FIELDS =
-1
- InvalidDelimiter =
Class.new(ArgumentError)
Class Method Summary collapse
- .get_count(xml) ⇒ Object
-
.parse(columns, data, delimiter = nil) ⇒ Object
Parses a single row of RETS-COMPACT data.
- .parse_document(xml) ⇒ Object
Class Method Details
.get_count(xml) ⇒ Object
87 88 89 90 91 92 93 94 |
# File 'lib/rets/parser/compact.rb', line 87 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) ⇒ Object
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).
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/rets/parser/compact.rb', line 70 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 { |x| CGI.unescapeHTML(x) } 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) ⇒ Object
12 13 14 15 16 17 18 19 |
# File 'lib/rets/parser/compact.rb', line 12 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 |