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
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 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
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
Returns a copy of this attribute
# File rexml-3.4.0/lib/rexml/attribute.rb, line 164 def clone Attribute.new self end
# File rexml-3.4.0/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 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
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
# File rexml-3.4.0/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 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
# File rexml-3.4.0/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 rexml-3.4.0/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 rexml-3.4.0/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 rexml-3.4.0/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 rexml-3.4.0/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 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('"', '"') 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 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
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
# File rexml-3.4.0/lib/rexml/attribute.rb, line 204 def xpath path = @element.xpath path += "/@#{self.expanded_name}" return path end