Class: REXML::Attribute

Inherits:
Object show all
Includes:
Namespace, Node
Defined in:
lib/rexml/attribute.rb

Overview

Defines an Element Attribute; IE, a attribute=value pair, as in: . Attributes can be in their own namespaces. General users of REXML will not interact with the Attribute class much.

Constant Summary collapse

PATTERN =
/\s*(#{NAME_STR})\s*=\s*(["'])(.*?)\2/um

Constants included from Namespace

Namespace::NAMESPLIT

Constants included from XMLTokens

XMLTokens::NAME, XMLTokens::NAMECHAR, XMLTokens::NAME_STR, XMLTokens::NCNAME_STR, XMLTokens::NMTOKEN, XMLTokens::NMTOKENS, XMLTokens::REFERENCE

Instance Attribute Summary collapse

Attributes included from Namespace

#expanded_name, #name

Instance Method Summary collapse

Methods included from Namespace

#fully_expanded_name, #has_name?

Methods included from Node

#each_recursive, #find_first_recursive, #indent, #index_in_parent, #next_sibling_node, #parent?, #previous_sibling_node

Constructor Details

#initialize(first, second = nil, parent = nil) ⇒ Attribute

Constructor.

Attribute.new( attribute_to_clone ) Attribute.new( source ) Attribute.new( "attr", "attr_value" ) Attribute.new( "attr", "attr_value", parent_element )



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/rexml/attribute.rb', line 26

def initialize( first, second=nil, parent=nil )
	@normalized = @unnormalized = @element = nil
	if first.kind_of? Attribute
		self.name = first.expanded_name
		@value = first.value
		if second.kind_of? Element
			@element = second
		else
			@element = first.element
		end
	elsif first.kind_of? String
		@element = parent if parent.kind_of? Element
		self.name = first
		@value = second.to_s
	else
		raise "illegal argument #{first.class.name} to Attribute constructor"
	end
end

Instance Attribute Details

#elementObject

The element to which this attribute belongs



14
15
16
# File 'lib/rexml/attribute.rb', line 14

def element
  @element
end

#normalized=(value) ⇒ Object (writeonly)

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



17
18
19
# File 'lib/rexml/attribute.rb', line 17

def normalized=(value)
  @normalized = value
end

Instance Method Details

#==(other) ⇒ Object

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



74
75
76
# File 'lib/rexml/attribute.rb', line 74

def ==( other )
	other.kind_of?(Attribute) and other.name==name and other.value==@value
end

#cloneObject

Returns a copy of this attribute



121
122
123
# File 'lib/rexml/attribute.rb', line 121

def clone
	Attribute.new self
end

#hashObject

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



79
80
81
# File 'lib/rexml/attribute.rb', line 79

def hash
	name.hash + value.hash
end

#inspectObject



150
151
152
153
154
# File 'lib/rexml/attribute.rb', line 150

def inspect
  rv = ""
  write( rv )
  rv
end

#namespace(arg = nil) ⇒ Object

Returns the namespace URL, if defined, or nil otherwise

e = Element.new("el") e.add_attributes("http://url") e.namespace( "ns" ) # -> "http://url"



67
68
69
70
# File 'lib/rexml/attribute.rb', line 67

def namespace arg=nil
	arg = prefix if arg.nil?
	@element.namespace arg
end

#node_typeObject



146
147
148
# File 'lib/rexml/attribute.rb', line 146

def node_type
  :attribute
end

#prefixObject

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



54
55
56
57
58
59
60
# File 'lib/rexml/attribute.rb', line 54

def prefix
	pf = super
	if pf == ""
		pf = @element.prefix if @element
	end
	pf
end

#removeObject

Removes this Attribute from the tree, and returns true if successfull

This method is usually not called directly.



137
138
139
# File 'lib/rexml/attribute.rb', line 137

def remove
	@element.attributes.delete self.name unless @element.nil?
end

#to_sObject

Returns the attribute value, with entities replaced



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/rexml/attribute.rb', line 94

def to_s
	return @normalized if @normalized

	doctype = nil
	if @element
		doc = @element.document
		doctype = doc.doctype if doc
	end

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

#to_stringObject

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



89
90
91
# File 'lib/rexml/attribute.rb', line 89

def to_string
	"#@expanded_name='#{to_s().gsub(/'/, ''')}'"
end

#valueObject

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



109
110
111
112
113
114
115
116
117
118
# File 'lib/rexml/attribute.rb', line 109

def value
	return @unnormalized if @unnormalized
	doctype = nil
	if @element
		doc = @element.document
		doctype = doc.doctype if doc
	end
	@normalized = nil
	@unnormalized = Text::unnormalize( @value, doctype )
end

#write(output, indent = -1 )) ⇒ Object

Writes this attribute (EG, puts 'key="value"' to the output)



142
143
144
# File 'lib/rexml/attribute.rb', line 142

def write( output, indent=-1 )
	output << to_string
end

#xpathObject



156
157
158
159
160
# File 'lib/rexml/attribute.rb', line 156

def xpath
  path = @element.xpath
  path += "/@#{self.expanded_name}"
  return path
end