class REXML::Attribute

定义一个 Element Attribute;即,一个 attribute=value 对,如:<element attribute=“value”/>。Attributes 可以位于它们自己的命名空间中。REXML 的普通用户不会与 Attribute 类进行太多交互。

常量

NEEDS_A_SECOND_CHECK
PATTERN

属性

element[R]

此属性所属的元素

公共类方法

new( first, second=nil, parent=nil ) 点击切换源代码

构造函数。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 ) 点击切换源代码

如果 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
clone() 点击切换源代码

返回此属性的副本

# File rexml-3.4.0/lib/rexml/attribute.rb, line 164
def clone
  Attribute.new self
end
doctype() 点击切换源代码
# File rexml-3.4.0/lib/rexml/attribute.rb, line 132
def doctype
  if @element
    doc = @element.document
    doc.doctype if doc
  end
end
element=( element ) 点击切换源代码

设置此对象是其属性的元素。通常,这不是直接调用的。

返回此属性

# 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
hash() 点击切换源代码

从名称和值创建(并返回)一个哈希值

# File rexml-3.4.0/lib/rexml/attribute.rb, line 111
def hash
  name.hash + value.hash
end
inspect() 点击切换源代码
# File rexml-3.4.0/lib/rexml/attribute.rb, line 198
def inspect
  rv = +""
  write( rv )
  rv
end
namespace(arg=nil) 点击切换源代码

如果定义了命名空间 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
node_type() 点击切换源代码
# File rexml-3.4.0/lib/rexml/attribute.rb, line 194
def node_type
  :attribute
end
normalized=(new_normalized) 点击切换源代码

此属性的规范化值。也就是说,具有完整实体的属性。

# File rexml-3.4.0/lib/rexml/attribute.rb, line 158
def normalized=(new_normalized)
  @normalized = new_normalized
  @unnormalized = nil
end
prefix() 点击切换源代码

返回属性的命名空间。

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
remove() 点击切换源代码

从树中删除此 Attribute,如果成功则返回 true

此方法通常不直接调用。

# File rexml-3.4.0/lib/rexml/attribute.rb, line 185
def remove
  @element.attributes.delete self.name unless @element.nil?
end
to_s() 点击切换源代码

返回属性值,实体已替换

# 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
to_string() 点击切换源代码

将此属性作为 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('"', '&quot;') if value.include?('"')
    %Q^#@expanded_name="#{value}"^
  else
    value = value.gsub("'", '&apos;') if value.include?("'")
    "#@expanded_name='#{value}'"
  end
end
value() 点击切换源代码

返回此属性的非规范化值。也就是说,实体已展开为其值

# 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
write( output, indent=-1 ) 点击切换源代码

写入此属性(例如,将“key=“value””输出到输出)

# File rexml-3.4.0/lib/rexml/attribute.rb, line 190
def write( output, indent=-1 )
  output << to_string
end
xpath() 点击切换源代码
# File rexml-3.4.0/lib/rexml/attribute.rb, line 204
def xpath
  path = @element.xpath
  path += "/@#{self.expanded_name}"
  return path
end