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.
Constructor. FIXME: The parser doesn't catch illegal characters in attributes
Either: an Attribute
, which this new attribute will become a clone of; or a String, which is the name of this attribute
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).
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/attribute.rb, line 45 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
Returns true if other is an Attribute
and has the same name and value, false otherwise.
# File rexml/attribute.rb, line 109 def ==( other ) other.kind_of?(Attribute) and other.name==name and other.value==value end
Returns a copy of this attribute
# File rexml/attribute.rb, line 158 def clone Attribute.new self end
# File 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/attribute.rb, line 166 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/attribute.rb, line 114 def hash name.hash + value.hash end
# File rexml/attribute.rb, line 192 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/attribute.rb, line 98 def namespace arg=nil arg = prefix if arg.nil? if arg == "" "" else @element.namespace(arg) end 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/attribute.rb, line 73 def prefix super end
Removes this Attribute
from the tree, and returns true if successful
This method is usually not called directly.
# File rexml/attribute.rb, line 179 def remove @element.attributes.delete self.name unless @element.nil? end
Returns the attribute value, with entities replaced
# File rexml/attribute.rb, line 140 def to_s return @normalized if @normalized @normalized = Text::normalize( @unnormalized, doctype ) @unnormalized = nil @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/attribute.rb, line 124 def to_string if @element and @element.context and @element.context[:attribute_quote] == :quote %Q^#@expanded_name="#{to_s().gsub(/"/, '"')}"^ else "#@expanded_name='#{to_s().gsub(/'/, ''')}'" end end
Returns the UNNORMALIZED value of this attribute. That is, entities have been expanded to their values
# File rexml/attribute.rb, line 150 def value return @unnormalized if @unnormalized @unnormalized = Text::unnormalize( @normalized, doctype ) @normalized = nil @unnormalized end