123456789_123456789_123456789_123456789_123456789_

Class: REXML::Attribute

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: lib/rexml/attribute.rb

Overview

Defines an Element Attribute; IE, a attribute=value pair, as in: <element attribute=“value”/>. Attributes can be in their own namespaces. General users of ::REXML will not interact with the Attribute class much.

Constant Summary

XMLTokens - Included

NAME, NAMECHAR, NAME_CHAR, NAME_START_CHAR, NAME_STR, NCNAME_STR, NMTOKEN, NMTOKENS, REFERENCE

Namespace - Included

NAMESPLIT

Class Method Summary

Instance Attribute Summary

Namespace - Included

#name

The name of the object, valid if set.

#name=

Sets the name and the expanded name.

#prefix

The expanded name of the object, valid if name is set.

#expanded_name

The name of the object, valid if set.

#local_name

Alias for Namespace#name.

Node - Included

Instance Method Summary

Namespace - Included

#fully_expanded_name

Fully expand the name, even if the prefix wasn't specified in the source file.

#has_name?

Compares names optionally WITH namespaces.

Node - Included

#each_recursive

Visit all subnodes of self recursively.

#find_first_recursive

Find (and return) first subnode (recursively) for which the block evaluates to true.

#indent,
#index_in_parent

Returns the position that self holds in its parent's array, indexed from 1.

#next_sibling_node, #previous_sibling_node,
#to_s
indent

Constructor Details

.new(first, second = nil, parent = nil) ⇒ Attribute

Constructor. FIXME: The parser doesn't catch illegal characters in attributes

first

Either: an Attribute, which this new attribute will become a clone of; or a String, which is the name of this attribute

second

If first is an Attribute, then this may be an Element, or nil. If nil, then the Element parent of this attribute is the parent of the first Attribute. If the first argument is a String, then this must also be a String, and is the content of the attribute. If this is the content, it must be fully normalized (contain no illegal characters).

parent

Ignored unless first is a String; otherwise, may be the Element parent of this attribute, or nil.

Attribute.new( attribute_to_clone )
Attribute.new( attribute_to_clone, parent_element )
Attribute.new( "attr", "attr_value" )
Attribute.new( "attr", "attr_value", parent_element )
[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 44

def initialize( first, second=nil, parent=nil )
  @normalized = @unnormalized = @element = nil
  if first.kind_of? Attribute
    self.name = first.expanded_name
    @unnormalized = first.value
    if second.kind_of? Element
      @element = second
    else
      @element = first.element
    end
  elsif first.kind_of? String
    @element = parent
    self.name = first
    @normalized = second.to_s
  else
    raise "illegal argument #{first.class.name} to Attribute constructor"
  end
end

Instance Attribute Details

#element (rw)

The element to which this attribute belongs

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 14

attr_reader :element

#element=(element) (rw)

Sets the element of which this object is an attribute. Normally, this is not directly called.

Returns this attribute

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 152

def element=( element )
  @element = element

  if @normalized
    Text.check( @normalized, NEEDS_A_SECOND_CHECK, doctype )
  end

  self
end

#normalized=(value) (writeonly)

The normalized value of this attribute. That is, the attribute with entities intact.

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 17

attr_writer :normalized

Instance Method Details

#==(other)

Returns true if other is an Attribute and has the same name and value, false otherwise.

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 95

def ==( other )
  other.kind_of?(Attribute) and other.name==name and other.value==value
end

#clone

Returns a copy of this attribute

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 144

def clone
  Attribute.new self
end

#doctype

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 118

def doctype
  if @element
    doc = @element.document
    doc.doctype if doc
  end
end

#hash

Creates (and returns) a hash from both the name and value

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 100

def hash
  name.hash + value.hash
end

#inspect

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 178

def inspect
  rv = ""
  write( rv )
  rv
end

#namespace(arg = nil)

Returns the namespace URL, if defined, or nil otherwise

e = Element.new("el")
e.add_namespace("ns", "http://url")
e.add_attribute("ns:a", "b")
e.add_attribute("nsx:a", "c")
e.attribute("ns:a").namespace # => "http://url"
e.attribute("nsx:a").namespace # => nil
[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 88

def namespace arg=nil
  arg = prefix if arg.nil?
  @element.namespace arg
end

#node_type

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 174

def node_type
  :attribute
end

#prefix

Returns the namespace of the attribute.

e = Element.new( "elns:myelement" )
e.add_attribute( "nsa:a", "aval" )
e.add_attribute( "b", "bval" )
e.attributes.get_attribute( "a" ).prefix   # -> "nsa"
e.attributes.get_attribute( "b" ).prefix   # -> "elns"
a = Attribute.new( "x", "y" )
a.prefix                                   # -> ""
[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 72

def prefix
  pf = super
  if pf == ""
    pf = @element.prefix if @element
  end
  pf
end

#remove

Removes this Attribute from the tree, and returns true if successful

This method is usually not called directly.

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 165

def remove
  @element.attributes.delete self.name unless @element.nil?
end

#to_s

Returns the attribute value, with entities replaced

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 126

def to_s
  return @normalized if @normalized

  @normalized = Text::normalize( @unnormalized, doctype )
  @unnormalized = nil
  @normalized
end

#to_string

Returns this attribute out as XML source, expanding the name

a = Attribute.new( "x", "y" )
a.to_string     # -> "x='y'"
b = Attribute.new( "ns:x", "y" )
b.to_string     # -> "ns:x='y'"
[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 110

def to_string
  if @element and @element.context and @element.context[:attribute_quote] == :quote
    %Q^#@expanded_name="#{to_s().gsub(/"/, '&quot;')}"^
  else
    "#@expanded_name='#{to_s().gsub(/'/, '&apos;')}'"
  end
end

#value

Returns the UNNORMALIZED value of this attribute. That is, entities have been expanded to their values

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 136

def value
  return @unnormalized if @unnormalized
  @unnormalized = Text::unnormalize( @normalized, doctype )
  @normalized = nil
  @unnormalized
end

#write(output, indent = -1 ))

Writes this attribute (EG, puts 'key=“value”' to the output)

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 170

def write( output, indent=-1 )
  output << to_string
end

#xpath

[ GitHub ]

  
# File 'lib/rexml/attribute.rb', line 184

def xpath
  path = @element.xpath
  path += "/@#{self.expanded_name}"
  return path
end