libxml-to-hash 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/libxml_to_hash.rb +138 -0
  2. metadata +61 -0
@@ -0,0 +1,138 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ # USAGE: Hash.from_libxml(YOUR_XML_STRING)
4
+ require 'xml/libxml'
5
+ # adapted from
6
+ # http://movesonrails.com/articles/2008/02/25/libxml-for-active-resource-2-0
7
+
8
+ # This class is required to represent Nodes that contain
9
+ # attributes as well as other content, for example:
10
+ # <karin zak="lebt">schon</karin>
11
+ # We cannot non-ambigiously represent this node as a hash
12
+ # because Hashes may contain arbitrary keys.
13
+ # Having a separate class for representing such nodes
14
+ # allows for easy testing for the class (which we have
15
+ # to do anyway since hash values may be Strings, Arrays
16
+ # or other Hashes already)
17
+ # Update: No need for testing when using the iterable method.
18
+ # Usage: LibXmlNode.new("karin", "zak")
19
+
20
+ class LibXmlNode < Object
21
+ attr_accessor :subnodes
22
+ attr_accessor :attributes
23
+ attr_accessor :text
24
+
25
+ def initialize
26
+ @subnodes = {}
27
+ @attributes = {}
28
+ @text = ""
29
+ end
30
+
31
+ def self.create(n, a, t)
32
+ l = LibXmlNode.new
33
+ l.subnodes = n
34
+ l.attributes = a
35
+ l.text = t
36
+ l
37
+ end
38
+
39
+ def add_attribute(key, value)
40
+ @attributes[key] = value
41
+ end
42
+
43
+ def add_node(key, value)
44
+ if @subnodes[key]
45
+ if @subnodes[key].is_a? Object::Array
46
+ @subnodes[key] << value
47
+ else
48
+ @subnodes[key] = [@subnodes[key], value]
49
+ end
50
+ else
51
+ @subnodes[key] = value
52
+ end
53
+ end
54
+
55
+ def add_text(t)
56
+ @text << t
57
+ end
58
+
59
+ def simplify
60
+ if @attributes.empty?
61
+ if @text == ""
62
+ return @subnodes
63
+ end
64
+ if @subnodes == {}
65
+ return @text
66
+ end
67
+ end
68
+ return self
69
+ end
70
+
71
+ def ==(other)
72
+ if other.class == LibXmlNode
73
+ if @subnodes == other.subnodes and @attributes == other.attributes and @text == other.text
74
+ return true
75
+ end
76
+ end
77
+ false
78
+ end
79
+
80
+ def iterable
81
+ [self]
82
+ end
83
+ end
84
+
85
+ class Hash
86
+ def iterable
87
+ [self]
88
+ end
89
+
90
+ class << self
91
+ def from_libxml!(xml, strict=true)
92
+ XML.default_load_external_dtd = false
93
+ XML.default_pedantic_parser = strict
94
+ result = XML::Parser.string(xml).parse
95
+ return { result.root.name.to_s => xml_node_to_hash(result.root)}
96
+ end
97
+
98
+ def from_libxml(xml, strict=true)
99
+ begin
100
+ from_libxml!(xml, strict)
101
+ rescue Exception => e
102
+ nil
103
+ end
104
+ end
105
+
106
+ def xml_node_to_hash(node)
107
+ n = LibXmlNode.new
108
+ if node.element?
109
+ node.attributes.each do |attribute|
110
+ n.add_attribute attribute.name.to_s, attribute.value
111
+ end
112
+
113
+ node.each_child do |child|
114
+ if child.text?
115
+ if not child.children?
116
+ n.add_text child.content.to_s.strip
117
+ end
118
+ else
119
+ n.add_node child.name.to_s, xml_node_to_hash(child)
120
+ end
121
+ end
122
+ end
123
+ return n.simplify
124
+ end
125
+ end
126
+ end
127
+
128
+ class String
129
+ def iterable
130
+ [self]
131
+ end
132
+ end
133
+
134
+ class Array
135
+ def iterable
136
+ self
137
+ end
138
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: libxml-to-hash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Johannes Thoma
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-05 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: libxml-ruby
16
+ requirement: &79542540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *79542540
25
+ description: ! 'A simple library to convert XML strings to hashes using libxml
26
+
27
+
28
+ This adds to from_lib_xml method to the Hash class which uses libxml (which
29
+
30
+ is much faster than ReXML) to convert a XML string into a Hash'
31
+ email: johannes.thoma@gmx.at
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - lib/libxml_to_hash.rb
37
+ homepage: http://rubygems.org/gems/libxml-to-hash
38
+ licenses: []
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 1.8.10
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: A simple library to convert XML strings to hashes using libxml
61
+ test_files: []