class LibXML::XML::Attr

Provides access to an attribute defined on an element.

Basic Usage:

require 'test_helper'

doc = XML::Document.new(<some_file>)
attribute = doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
attribute.name == 'href'
attribute.value == 'http://www.mydocument.com'
attribute.remove!

Public Class Methods

initialize(node, "name", "value") click to toggle source

Creates a new attribute for the node.

node: The XML::Node that will contain the attribute name: The name of the attribute value: The value of the attribute

attr = XML::Attr.new(doc.root, 'name', 'libxml')
static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
{
  VALUE node = argv[0];
  VALUE name = argv[1];
  VALUE value = argv[2];
  VALUE ns = (argc == 4 ? argv[3] : Qnil);

  xmlNodePtr xnode;
  xmlAttrPtr xattr;

  if (argc < 3 || argc > 4)
    rb_raise(rb_eArgError, "Wrong number of arguments (3 or 4)");

  Check_Type(name, T_STRING);
  Check_Type(value, T_STRING);

  Data_Get_Struct(node, xmlNode, xnode);

  if (xnode->type != XML_ELEMENT_NODE)
    rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");

  if (NIL_P(ns))
  {
    xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
  }
  else
  {
    xmlNsPtr xns;
    Data_Get_Struct(ns, xmlNs, xns);
    xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
  }

  if (!xattr)
    rb_raise(rb_eRuntimeError, "Could not create attribute.");

  DATA_PTR( self) = xattr;
  return self;
}

Public Instance Methods

child → node click to toggle source

Obtain this attribute’s child attribute(s).

static VALUE rxml_attr_child_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->children == NULL)
    return Qnil;
  else
    return rxml_node_wrap((xmlNodePtr) xattr->children);
}
child? → (true|false) click to toggle source

Returns whether this attribute has child attributes.

   # File lib/libxml/attr.rb
13 def child?
14   not self.children.nil?
15 end
doc → XML::Document click to toggle source

Returns this attribute’s document.

doc.root.attributes.get_attribute('name').doc == doc
static VALUE rxml_attr_doc_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->doc == NULL)
    return Qnil;
  else
    return rxml_document_wrap(xattr->doc);
}
doc? → (true|false) click to toggle source

Determine whether this attribute is associated with an XML::Document.

   # File lib/libxml/attr.rb
22 def doc?
23   not self.doc.nil?
24 end
each(&blk)
Alias for: each_sibling
each_attr(&blk)
Alias for: each_sibling
each_sibling(&blk) click to toggle source
   # File lib/libxml/attr.rb
97 def each_sibling(&blk)
98   siblings(self,&blk)
99 end
Also aliased as: each_attr, each
last → node click to toggle source

Obtain the last attribute.

static VALUE rxml_attr_last_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->last == NULL)
    return Qnil;
  else
    return rxml_node_wrap(xattr->last);
}
last? → (true|false) click to toggle source

Determine whether this is the last attribute.

   # File lib/libxml/attr.rb
30 def last?
31   self.last.nil?
32 end
name → "name" click to toggle source

Obtain this attribute’s name.

static VALUE rxml_attr_name_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);

  if (xattr->name == NULL)
    return Qnil;
  else
    return rxml_new_cstr( xattr->name, NULL);
}
namespacess → XML::Namespaces click to toggle source

Returns this node’s XML::Namespaces object, which is used to access the namespaces associated with this node.

   # File lib/libxml/attr.rb
57 def namespaces
58   @namespaces ||= XML::Namespaces.new(self)
59 end
next → node click to toggle source

Obtain the next attribute.

static VALUE rxml_attr_next_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->next == NULL)
    return Qnil;
  else
    return rxml_attr_wrap(xattr->next);
}
next? → (true|false) click to toggle source

Determine whether there is a next attribute.

   # File lib/libxml/attr.rb
38 def next?
39   not self.next.nil?
40 end
node_type → num click to toggle source

Obtain this node’s type identifier.

static VALUE rxml_attr_node_type(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  return INT2NUM(xattr->type);
}
node_type_name() click to toggle source

Returns this node’s type name

   # File lib/libxml/attr.rb
79 def node_type_name
80   if node_type == Node::ATTRIBUTE_NODE
81     'attribute'
82   else
83     raise(UnknownType, "Unknown node type: %n", node.node_type);
84   end
85 end
ns → namespace click to toggle source

Obtain this attribute’s associated XML::NS, if any.

static VALUE rxml_attr_ns_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->ns == NULL)
    return Qnil;
  else
    return rxml_namespace_wrap(xattr->ns);
}
ns? → (true|false) click to toggle source

Determine whether this attribute has an associated namespace.

   # File lib/libxml/attr.rb
47 def ns?
48   not self.ns.nil?
49 end
parent → node click to toggle source

Obtain this attribute node’s parent.

static VALUE rxml_attr_parent_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->parent == NULL)
    return Qnil;
  else
    return rxml_node_wrap(xattr->parent);
}
parent? → (true|false) click to toggle source

Determine whether this attribute has a parent.

   # File lib/libxml/attr.rb
66 def parent?
67   not self.parent.nil?
68 end
prev → node click to toggle source

Obtain the previous attribute.

static VALUE rxml_attr_prev_get(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  if (xattr->prev == NULL)
    return Qnil;
  else
    return rxml_attr_wrap(xattr->prev);
}
prev? → (true|false) click to toggle source

Determine whether there is a previous attribute.

   # File lib/libxml/attr.rb
74 def prev?
75   not self.prev.nil?
76 end
remove! → nil click to toggle source

Removes this attribute from it’s parent. Note the attribute and its content is freed and can no longer be used. If you try to use it you will get a segmentation fault.

static VALUE rxml_attr_remove_ex(VALUE self)
{
  xmlAttrPtr xattr;
  Data_Get_Struct(self, xmlAttr, xattr);
  xmlRemoveProp(xattr);

  RDATA(self)->data = NULL;
  RDATA(self)->dfree = NULL;
  RDATA(self)->dmark = NULL;

  return Qnil;
}
siblings(node, &blk) click to toggle source

Iterates nodes and attributes

   # File lib/libxml/attr.rb
88 def siblings(node, &blk)
89   if n = node
90     loop do
91       blk.call(n)
92       break unless n = n.next
93     end
94   end
95 end
to_a() click to toggle source
    # File lib/libxml/attr.rb
111 def to_a
112   inject([]) do |ary,a| 
113     ary << [a.name, a.value]
114     ary
115   end
116 end
to_h() click to toggle source
    # File lib/libxml/attr.rb
104 def to_h
105   inject({}) do |h,a|
106     h[a.name] = a.value
107     h
108   end
109 end
to_s() click to toggle source
    # File lib/libxml/attr.rb
118 def to_s
119   "#{name} = #{value}"
120 end
value → "value" click to toggle source

Obtain the value of this attribute.

VALUE rxml_attr_value_get(VALUE self)
{
  xmlAttrPtr xattr;
  xmlChar *value;
  VALUE result = Qnil;

  Data_Get_Struct(self, xmlAttr, xattr);
  value = xmlNodeGetContent((xmlNodePtr)xattr);

  if (value != NULL)
  {
    result = rxml_new_cstr( value, NULL);
    xmlFree(value);
  }
  return result;
}
value = "value" click to toggle source

Sets the value of this attribute.

VALUE rxml_attr_value_set(VALUE self, VALUE val)
{
  xmlAttrPtr xattr;

  Check_Type(val, T_STRING);
  Data_Get_Struct(self, xmlAttr, xattr);

  if (xattr->ns)
    xmlSetNsProp(xattr->parent, xattr->ns, xattr->name,
        (xmlChar*) StringValuePtr(val));
  else
    xmlSetProp(xattr->parent, xattr->name, (xmlChar*) StringValuePtr(val));

  return (self);
}