blob: bfafa29dd5fcd707ef7c00c1e955284ce11771de (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# = XML Mini Nokogiri implementation
module ActiveSupport
module XmlMini_Nokogiri #:nodoc:
extend self
# Parse an XML Document string into a simple hash using libxml / nokogiri.
# string::
# XML Document string to parse
def parse(string)
return {} if string.blank?
doc = Nokogiri::XML(string).to_hash
end
module Conversions
module Document
def to_hash
root.to_hash
end
end
module Node
CONTENT_ROOT = '__content__'
# Convert XML document to hash
#
# hash::
# Hash to merge the converted element into.
def to_hash(hash = {})
hash[name] ||= attributes_as_hash
walker = lambda { |child, memo, callback|
next if child.blank?
if child.text?
(memo[CONTENT_ROOT] ||= '') << child.content
next
end
name = child.name
if memo[name]
memo[name] = [memo[name]].flatten
memo[name] << child.attributes_as_hash
else
memo[name] = child.attributes_as_hash
end
# Recusively walk children
child.children.each { |c| callback.call(c, memo[name], callback) }
}
children.each { |c| walker.call(c, hash[name], walker) }
hash
end
def attributes_as_hash
Hash[*(attribute_nodes.map { |node|
[node.node_name, node.value]
}.flatten)]
end
end
end
Nokogiri::XML::Document.send(:include, Conversions::Document)
Nokogiri::XML::Node.send(:include, Conversions::Node)
end
end
|