class REXML::Element

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

Public Class Methods

import(xmlelement) click to toggle source
# File lib/xmpp4r/rexmladdons.rb, line 87
def self.import(xmlelement)
  self.new(xmlelement.name).import(xmlelement)
end

Public Instance Methods

==(o) click to toggle source

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

See Test::Unit::Assertions

# File lib/xmpp4r/rexmladdons.rb, line 103
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) click to toggle source

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

# File lib/xmpp4r/rexmladdons.rb, line 94
def delete_elements(element)
  while(delete_element(element)) do end
end
each_elements(*els, &block) click to toggle source
# 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) click to toggle source

Returns first element of name e

# File lib/xmpp4r/rexmladdons.rb, line 42
def first_element(e)
  each_element(e) { |el| return el }
  return nil
end
first_element_text(e) click to toggle source

Returns text of first element of name e

# File lib/xmpp4r/rexmladdons.rb, line 49
def first_element_text(e)
  el = first_element(e)
  if el
    return el.text
  else
    return nil
  end
end
import(xmlelement) click to toggle source

import this element's children and attributes

# File lib/xmpp4r/rexmladdons.rb, line 69
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_text(e, t) click to toggle source

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

# File lib/xmpp4r/rexmladdons.rb, line 28
def replace_element_text(e, t)
  el = first_element(e)
  if el.nil?
    el = REXML::Element.new(e)
    add_element(el)
  end
  if t
    el.text = t
  end
  self
end
typed_add(e) click to toggle source

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.

# File lib/xmpp4r/rexmladdons.rb, line 63
def typed_add(e)
  add(e)
end