class REXML::Attribute
定义一个 Element
Attribute
;即,一个 attribute=value 对,如:<element attribute=“value”/>。Attributes
可以位于它们自己的命名空间中。REXML
的普通用户不会与 Attribute
类进行太多交互。
常量
- NEEDS_A_SECOND_CHECK
- PATTERN
属性
此属性所属的元素
公共类方法
构造函数。FIXME:解析器不会捕获属性中的非法字符
- first
-
可以是:一个
Attribute
,这个新属性将成为它的克隆;或者是一个字符串,它是这个属性的名称 - second
-
如果
first
是一个Attribute
,那么这可以是一个Element
,或者 nil。如果为 nil,那么此属性的Element
父级是first
Attribute
的父级。如果第一个参数是一个字符串,那么这也必须是一个字符串,并且是属性的内容。如果这是内容,它必须是完全规范化的(不包含非法字符)。 - parent
-
忽略,除非
first
是一个字符串;否则,可以是此属性的Element
父级,或者 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
公共实例方法
如果 other 是一个 Attribute
并且具有相同的名称和值,则返回 true,否则返回 false。
# 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
返回此属性的副本
# 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
设置此对象是其属性的元素。通常,这不是直接调用的。
返回此属性
# 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
从名称和值创建(并返回)一个哈希值
# 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
如果定义了命名空间 URL,则返回命名空间 URL,否则返回 nil
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
对于没有命名空间的属性,此方法始终返回“”。因为默认命名空间不适用于属性名称。
来自 www.w3.org/TR/xml-names/#uniqAttrs
> 默认命名空间不适用于属性名称
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
此属性的规范化值。也就是说,具有完整实体的属性。
# File rexml-3.4.0/lib/rexml/attribute.rb, line 158 def normalized=(new_normalized) @normalized = new_normalized @unnormalized = nil end
返回属性的命名空间。
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
从树中删除此 Attribute
,如果成功则返回 true
此方法通常不直接调用。
# File rexml-3.4.0/lib/rexml/attribute.rb, line 185 def remove @element.attributes.delete self.name unless @element.nil? end
返回属性值,实体已替换
# 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
将此属性作为 XML 源输出,展开名称
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
返回此属性的非规范化值。也就是说,实体已展开为其值
# 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
写入此属性(例如,将“key=“value””输出到输出)
# 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