class REXML::Attributes
operations for accessing elements in that set.
A class that defines the set of Attributes of an Element and provides
def [](name)
Related: get_attribute (returns an \Attribute object).
ele.attributes['nosuch'] # => nil
ele.attributes['bar:att'] # => "2"
ele.attributes['att'] # => "<"
ele = d.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
with entities expanded:
The value returned is the unnormalized attribute value,
if it exists; otherwise +nil+.
Returns the value for the attribute given by +name+,
[name] -> attribute_value or nil
:call-seq:
def [](name) attr = get_attribute(name) return attr.value unless attr.nil? return nil end
def []=( name, value )
attrs.include?('baz:att') # => false
attrs['baz:att'] = nil
When +value+ is +nil+, deletes the attribute if it exists:
attrs['baz:att'] = '3' # => "3"
attrs['foo:att'] = '2' # => "2"
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
overwriting the previous value if it exists:
assigns that to the attribute for the given +name+,
When +value+ is non-+nil+,
[name] = value -> value
:call-seq:
def []=( name, value ) if value.nil? # Delete the named attribute attr = get_attribute(name) delete attr return end unless value.kind_of? Attribute if @element.document and @element.document.doctype value = Text::normalize( value, @element.document.doctype ) else value = Text::normalize( value, nil ) end value = Attribute.new(name, value) end value.element = @element old_attr = fetch(value.name, nil) if old_attr.nil? store(value.name, value) elsif old_attr.kind_of? Hash old_attr[value.prefix] = value elsif old_attr.prefix != value.prefix store value.name, {old_attr.prefix => old_attr, value.prefix => value} else store value.name, value end return @element end
def add( attribute )
attrs.include?('baz') # => true
attrs.add(REXML::Attribute.new('baz', '3')) # => baz='3'
attrs.add(REXML::Attribute.new('foo:att', '2')) # => foo:att='2'
attrs # => {"att"=>{"foo"=>foo:att='1', "bar"=>bar:att='2', ""=>att='<'}}
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
returns +attribute+:
attribute of the same name if it exists;
Adds attribute +attribute+, replacing the previous
add(attribute) -> attribute
:call-seq:
def add( attribute ) self[attribute.name] = attribute end
def delete( attribute )
attrs.delete(attr) # =>
attrs.delete(attr) # =>
attr = REXML::Attribute.new('bar:att', '2')
removes that attribute if it exists:
When attribute argument +attribute+ is given,
attrs.delete('foo:att') # =>
attrs.delete('foo:att') # =>
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
removes the attribute of that name if it exists:
When string argument +name+ is given,
returns the attributes' element.
Removes a specified attribute if it exists;
delete(attribute) -> element
delete(name) -> element
:call-seq:
def delete( attribute ) name = nil prefix = nil if attribute.kind_of? Attribute name = attribute.name prefix = attribute.prefix else attribute =~ Namespace::NAMESPLIT prefix, name = $1, $2 prefix = '' unless prefix end old = fetch(name, nil) if old.kind_of? Hash # the supplied attribute is one of many old.delete(prefix) if old.size == 1 repl = nil old.each_value{|v| repl = v} store name, repl end elsif old.nil? return @element else # the supplied attribute is a top-level one super(name) end @element end
def delete_all( name )
attrs.delete_all('att') # => [att='<']
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
returns an array of the removed attributes:
Removes all attributes matching the given +name+;
delete_all(name) -> array_of_removed_attributes
:call-seq:
def delete_all( name ) rv = [] each_attribute { |attribute| rv << attribute if attribute.expanded_name == name } rv.each{ |attr| attr.remove } return rv end
def each
["att", "<"]
["bar:att", "2"]
["foo:att", "1"]
Output:
end
p [expanded_name, value]
ele.attributes.each do |expanded_name, value|
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
Calls the given block with each expanded-name/value pair:
each {|expanded_name, value| ... }
:call-seq:
def each return to_enum(__method__) unless block_given? each_attribute do |attr| yield [attr.expanded_name, attr.value] end end
def each_attribute # :yields: attribute
[REXML::Attribute, att='<']
[REXML::Attribute, bar:att='2']
[REXML::Attribute, foo:att='1']
Output:
end
p [attr.class, attr]
ele.attributes.each_attribute do |attr|
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
Calls the given block with each \REXML::Attribute object:
each_attribute {|attr| ... }
:call-seq:
def each_attribute # :yields: attribute return to_enum(__method__) unless block_given? each_value do |val| if val.kind_of? Attribute yield val else val.each_value { |atr| yield atr } end end end
def get_attribute( name )
attrs.get_attribute('nosuch') # => nil
attrs.get_attribute('att') # => att='<'
attrs.get_attribute('bar:att') # => bar:att='2'
attrs.get_attribute('foo:att').class # => REXML::Attribute
attrs.get_attribute('foo:att') # => foo:att='1'
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
Returns the \REXML::Attribute object for the given +name+:
get_attribute(name) -> attribute_object or nil
:call-seq:
def get_attribute( name ) attr = fetch( name, nil ) if attr.nil? return nil if name.nil? # Look for prefix name =~ Namespace::NAMESPLIT prefix, n = $1, $2 if prefix attr = fetch( n, nil ) # check prefix if attr == nil elsif attr.kind_of? Attribute return attr if prefix == attr.prefix else attr = attr[ prefix ] return attr end end element_document = @element.document if element_document and element_document.doctype expn = @element.expanded_name expn = element_document.doctype.name if expn.size == 0 attr_val = element_document.doctype.attribute_of(expn, name) return Attribute.new( name, attr_val ) if attr_val end return nil end if attr.kind_of? Hash attr = attr[ @element.prefix ] end return attr end
def get_attribute_ns(namespace, name)
attrs.get_attribute_ns('http://foo', 'nosuch') # => nil
attrs.get_attribute_ns('http://foo', 'att') # => foo:att='1'
attrs = ele.attributes
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
that matches the given +namespace+ and +name+:
Returns the \REXML::Attribute object among the attributes
get_attribute_ns(namespace, name)
:call-seq:
def get_attribute_ns(namespace, name) result = nil each_attribute() { |attribute| if name == attribute.name && namespace == attribute.namespace() && ( !namespace.empty? || !attribute.fully_expanded_name.index(':') ) # foo will match xmlns:foo, but only if foo isn't also an attribute result = attribute if !result or !namespace.empty? or !attribute.fully_expanded_name.index(':') end } result end
def initialize element
- +element.expanded_name+.
- +element.prefix+.
- +element.document+.
Other instance methods in class \REXML::Attributes may refer to:
attrs.object_id == ele.attributes.object_id # => false
attrs = REXML::Attributes.new(ele)
ele = REXML::Element.new('foo')
but its own attributes are not modified:
The element given by argument +element+ is stored,
Creates and returns a new \REXML::Attributes object.
new(element)
:call-seq:
def initialize element @element = element end
def length
ele.attributes.length # => 3
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
Returns the count of attributes:
length
:call-seq:
def length c = 0 each_attribute { c+=1 } c end
def namespaces
d.root.attributes.namespaces # => {"xmlns"=>"foo", "x"=>"bar", "y"=>"twee"}
d = REXML::Document.new(xml_string)
xml_string = ''
Returns a hash of name/value pairs for the namespaces:
namespaces
:call-seq:
def namespaces namespaces = {} each_attribute do |attribute| namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' end if @element.document and @element.document.doctype expn = @element.expanded_name expn = @element.document.doctype.name if expn.size == 0 @element.document.doctype.attributes_of(expn).each { |attribute| namespaces[attribute.name] = attribute.value if attribute.prefix == 'xmlns' or attribute.name == 'xmlns' } end namespaces end
def prefixes
d.root.attributes.prefixes # => ["x", "y"]
d = REXML::Document.new(xml_string)
xml_string = ''
namespace declaration, if one exists.
The array does not include the default
Returns an array of prefix strings in the attributes.
prefixes -> array_of_prefix_strings
:call-seq:
def prefixes ns = [] each_attribute do |attribute| ns << attribute.name if attribute.prefix == 'xmlns' end if @element.document and @element.document.doctype expn = @element.expanded_name expn = @element.document.doctype.name if expn.size == 0 @element.document.doctype.attributes_of(expn).each { |attribute| ns << attribute.name if attribute.prefix == 'xmlns' } end ns end
def to_a
attrs.first.class # => REXML::Attribute
attrs = ele.attributes.to_a # => [foo:att='1', bar:att='2', att='<']
ele = d.root.elements['//ele'] # =>
d = REXML::Document.new(xml_string)
EOT
xml_string = <<-EOT
the attributes:
Returns an array of \REXML::Attribute objects representing
to_a -> array_of_attribute_objects
:call-seq:
def to_a enum_for(:each_attribute).to_a end