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
The element to which this attribute belongs
Public Class Methods
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 anAttribute
, then this may be anElement
, or nil. If nil, then theElement
parent of this attribute is the parent of thefirst
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 theElement
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 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
Returns true if other is an Attribute
and has the same name and value, false otherwise.
# File lib/rexml/attribute.rb, line 106 def ==( other ) other.kind_of?(Attribute) and other.name==name and other.value==value end
Returns a copy of this attribute
# File lib/rexml/attribute.rb, line 164 def clone Attribute.new self end
# File lib/rexml/attribute.rb, line 132 def doctype if @element doc = @element.document doc.doctype if doc end end
Sets the element of which this object is an attribute. Normally, this is not directly called.
Returns this attribute
# File lib/rexml/attribute.rb, line 172 def element=( element ) @element = element if @normalized Text.check( @normalized, NEEDS_A_SECOND_CHECK, doctype ) end self end
Creates (and returns) a hash from both the name and value
# File lib/rexml/attribute.rb, line 111 def hash name.hash + value.hash end
# File lib/rexml/attribute.rb, line 198 def inspect rv = +"" write( rv ) rv end
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 lib/rexml/attribute.rb, line 95 def namespace arg=nil arg = prefix if arg.nil? if arg == "" "" else @element.namespace(arg) end end
# File lib/rexml/attribute.rb, line 194 def node_type :attribute end
The normalized value of this attribute. That is, the attribute with entities intact.
# File lib/rexml/attribute.rb, line 158 def normalized=(new_normalized) @normalized = new_normalized @unnormalized = nil end
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 # -> ""
# File lib/rexml/attribute.rb, line 70 def prefix super end
Removes this Attribute
from the tree, and returns true if successful
This method is usually not called directly.
# File lib/rexml/attribute.rb, line 185 def remove @element.attributes.delete self.name unless @element.nil? end
Returns the attribute value, with entities replaced
# File lib/rexml/attribute.rb, line 140 def to_s return @normalized if @normalized @normalized = Text::normalize( @unnormalized, doctype ) @normalized end
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 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('"', '"') if value.include?('"') %Q^#@expanded_name="#{value}"^ else value = value.gsub("'", ''') if value.include?("'") "#@expanded_name='#{value}'" end end
Returns the UNNORMALIZED value of this attribute. That is, entities have been expanded to their values
# File 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
Writes this attribute (EG, puts ‘key=“value”’ to the output)
# File lib/rexml/attribute.rb, line 190 def write( output, indent=-1 ) output << to_string end
# File lib/rexml/attribute.rb, line 204 def xpath path = @element.xpath path += "/@#{self.expanded_name}" return path end