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, line 13
def child?
  not self.children.nil?
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, line 22
def doc?
  not self.doc.nil?
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, line 97
def each_sibling(&blk)
  siblings(self,&blk)
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, line 30
def last?
  self.last.nil?
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, line 57
def namespaces
  @namespaces ||= XML::Namespaces.new(self)
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, line 38
def next?
  not self.next.nil?
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, line 79
def node_type_name
  if node_type == Node::ATTRIBUTE_NODE
    'attribute'
  else
    raise(UnknownType, "Unknown node type: %n", node.node_type);
  end
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, line 47
def ns?
  not self.ns.nil?
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, line 66
def parent?
  not self.parent.nil?
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, line 74
def prev?
  not self.prev.nil?
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, line 88
def siblings(node, &blk)
  if n = node
    loop do
      blk.call(n)
      break unless n = n.next
    end
  end
end
to_a() click to toggle source
# File lib/libxml/attr.rb, line 111
def to_a
  inject([]) do |ary,a| 
    ary << [a.name, a.value]
    ary
  end
end
to_h() click to toggle source
# File lib/libxml/attr.rb, line 104
def to_h
  inject({}) do |h,a|
    h[a.name] = a.value
    h
  end
end
to_s() click to toggle source
# File lib/libxml/attr.rb, line 118
def to_s
  "#{name} = #{value}"
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);
}