class REXML::Attribute - rexml: Ruby Standard Library Documentation

# class REXML::Attribute

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.

### Constants

NEEDS_A_SECOND_CHECK
PATTERN

### Attributes

element[R]

The element to which this attribute belongs

### Public Class Methods

new( first, second=nil, parent=nil ) click to toggle source

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 )

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 42
    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

### Public Instance Methods

==( other ) click to toggle source

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

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 106
    def ==( other )
      other.kind_of?(Attribute) and other.name==name and other.value==value
    end

clone() click to toggle source

Returns a copy of this attribute

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 164
    def clone
      Attribute.new self
    end

doctype() click to toggle source

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 132
    def doctype
      if @element
        doc = @element.document
        doc.doctype if doc
      end
    end

element=( element ) click to toggle source

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

Returns this attribute

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 172
    def element=( element )
      @element = element

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

      self
    end

hash() click to toggle source

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

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 111
    def hash
      name.hash + value.hash
    end

inspect() click to toggle source

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 198
    def inspect
      rv = +""
      write( rv )
      rv
    end

namespace(arg=nil) click to toggle source

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

This method always returns “” for no namespace attribute. Because the default namespace doesn’t apply to attribute names.

From www.w3.org/TR/xml-names/#uniqAttrs

> the default namespace does not apply to attribute names

    e = REXML::Element.new("el")
    e.add_namespace("", "http://example.com/")
    e.namespace # => "http://example.com/"
    e.add_attribute("a", "b")
    e.attribute("a").namespace # => ""

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 95
    def namespace arg=nil
      arg = prefix if arg.nil?
      if arg == ""
        ""
      else
        @element.namespace(arg)
      end
    end

node_type() click to toggle source

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 194
    def node_type
      :attribute
    end

normalized=(new_normalized) click to toggle source

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

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 158
    def normalized=(new_normalized)
      @normalized = new_normalized
      @unnormalized = nil
    end

prefix() click to toggle source

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   # -> ""
    a = Attribute.new( "x", "y" )
    a.prefix                                   # -> ""

Calls superclass method

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 70
    def prefix
      super
    end

remove() click to toggle source

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

This method is usually not called directly.

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 185
    def remove
      @element.attributes.delete self.name unless @element.nil?
    end

to_s() click to toggle source

Returns the attribute value, with entities replaced

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 140
    def to_s
      return @normalized if @normalized

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

to_string() click to toggle source

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'"

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 121
    def to_string
      value = to_s
      if @element and @element.context and @element.context[:attribute_quote] == :quote
        value = value.gsub('"', '&quot;') if value.include?('"')
        %Q^#@expanded_name="#{value}"^
      else
        value = value.gsub("'", '&apos;') if value.include?("'")
        "#@expanded_name='#{value}'"
      end
    end

value() click to toggle source

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

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 149
    def value
      return @unnormalized if @unnormalized

      @unnormalized = Text::unnormalize(@normalized, doctype,
                                        entity_expansion_text_limit: @element&.document&.entity_expansion_text_limit)
    end

write( output, indent=-1 ) click to toggle source

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

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 190
    def write( output, indent=-1 )
      output << to_string
    end

xpath() click to toggle source

    # File rexml-3.4.0/lib/rexml/attribute.rb, line 204
    def xpath
      path = @element.xpath
      path += "/@#{self.expanded_name}"
      return path
    end