Class: REXML::Element

Inherits:
Object
  • Object
show all
Defined in:
lib/xmpp4r/rexmladdons.rb

Overview

this class adds a few helper methods to REXML::Element

Direct Known Subclasses

Jabber::XMPPElement

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.import(xmlelement) ⇒ Object



127
128
129
# File 'lib/xmpp4r/rexmladdons.rb', line 127

def self.import(xmlelement)
  self.new(xmlelement.name).import(xmlelement)
end

Instance Method Details

#==(o) ⇒ Object

Test for equality of two elements, useful for assert_equal in test cases. Tries to parse String o as XML.

See Test::Unit::Assertions



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/xmpp4r/rexmladdons.rb', line 143

def ==(o)
  return false unless self.kind_of? REXML::Element
  if o.kind_of? REXML::Element
    # Ok
  elsif o.kind_of? String
    # Parse o
    begin
      o = REXML::Document.new(o).root
    rescue REXML::ParseException
      return false
    end
  else
    # Cannot compare with anything other than Elements or Strings
    return false
  end

  return false unless name == o.name

  attributes.each_attribute do |attr|
    return false unless attr.value == o.attributes[attr.name]
  end

  o.attributes.each_attribute do |attr|
    return false unless attributes[attr.name] == attr.value
  end

  children.each_with_index do |child,i|
    return false unless child == o.children[i]
  end

  return true
end

#delete_elements(element) ⇒ Object

Deletes one or more children elements, not just one like REXML::Element#delete_element



134
135
136
# File 'lib/xmpp4r/rexmladdons.rb', line 134

def delete_elements(element)
  while(delete_element(element)) do end
end

#each_elements(*els, &block) ⇒ Object



20
21
22
23
24
# File 'lib/xmpp4r/rexmladdons.rb', line 20

def each_elements(*els, &block)
  els.inject([ ]) do |res, e|
    res + each_element(e, &block)
  end
end

#first_element(e, namespace = nil) ⇒ Object

Returns first element of name e



63
64
65
66
67
68
69
70
# File 'lib/xmpp4r/rexmladdons.rb', line 63

def first_element(e, namespace = nil)
  if namespace
    each_element_with_attribute("xmlns", namespace, 1, e) { |el| return el }
  else
    each_element(e) { |el| return el }
  end
  return nil
end

#first_element_content(e, namespace = nil) ⇒ Object

This method works like first_element_text except that it returns content of all children, not just the value of the first child text element.

Returns content of first element of name e



89
90
91
92
93
94
95
96
# File 'lib/xmpp4r/rexmladdons.rb', line 89

def first_element_content(e, namespace = nil)
  el = first_element(e, namespace)
  if el
    return el.children.join
  else
    return nil
  end
end

#first_element_text(e, namespace = nil) ⇒ Object

Returns text of first element of name e



74
75
76
77
78
79
80
81
# File 'lib/xmpp4r/rexmladdons.rb', line 74

def first_element_text(e, namespace = nil)
  el = first_element(e, namespace)
  if el
    return el.text
  else
    return nil
  end
end

#import(xmlelement) ⇒ Object

import this element's children and attributes



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/xmpp4r/rexmladdons.rb', line 109

def import(xmlelement)
  if @name and @name != xmlelement.name
    raise "Trying to import an #{xmlelement.name} to a #{@name} !"
  end
  add_attributes(xmlelement.attributes.clone)
  @context = xmlelement.context
  xmlelement.each do |e|
    if e.kind_of? REXML::Element
      typed_add(e.deep_clone)
    elsif e.kind_of? REXML::Text
      add_text(e.value)
    else
      add(e.clone)
    end
  end
  self
end

#replace_element_content(e, c, namespace = nil) ⇒ Object

Replaces or adds a child element of name e with content of t.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/xmpp4r/rexmladdons.rb', line 43

def replace_element_content(e, c, namespace = nil)
  el = first_element(e, namespace)
  if el.nil?
    el = REXML::Element.new(e)
    el.add_namespace(namespace)
    add_element(el)
  end
  if c
    el.children.each do |ch|
      ch.remove
    end
    c.root.children.each do |ch|
      el.add ch
    end
  end
  self
end

#replace_element_text(e, t, namespace = nil) ⇒ Object

Replaces or adds a child element of name e with text t.



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/xmpp4r/rexmladdons.rb', line 28

def replace_element_text(e, t, namespace = nil)
  el = first_element(e, namespace)
  if el.nil?
    el = REXML::Element.new(e)
    el.add_namespace(namespace)
    add_element(el)
  end
  if t
    el.text = t
  end
  self
end

#typed_add(e) ⇒ Object

This method does exactly the same thing as add(), but it can be overriden by subclasses to provide on-the-fly object creations. For example, if you import a REXML::Element of name 'plop', and you have a Plop class that subclasses REXML::Element, with typed_add you can get your REXML::Element to be “magically” converted to Plop.



103
104
105
# File 'lib/xmpp4r/rexmladdons.rb', line 103

def typed_add(e)
  add(e)
end