Class: LibXML::XML::Namespaces
- Inherits:
-
Object
- Object
- LibXML::XML::Namespaces
- Includes:
- Enumerable
- Defined in:
- ext/libxml/ruby_xml_namespaces.c,
lib/libxml/namespaces.rb,
ext/libxml/ruby_xml_namespaces.c
Overview
The XML::Namespaces class is used to access information about a node’s namespaces. For each node, libxml maintains:
-
The node’s namespace (#namespace)
-
Which namespaces are defined on the node (#definnitions)
-
Which namespaces are in scope for the node (#each)
Let’s look at an example:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<order xmlns="http://mynamespace.com"/>
</soap:Body>
</soap>
The Envelope node is in the soap namespace. It contains two namespace definitions, one for soap and one for xsd.
The Body node is also in the soap namespace and does not contain any namespaces. However, the soap and xsd namespaces are both in context.
The order node is in its default namespace and contains one namespace definition (mynamespace.com). There are three namespaces in context soap, xsd and the default namespace.
Instance Method Summary collapse
-
#default ⇒ Object
call-seq: namespace.default -> XML::Namespace.
-
#default_prefix=(prefix) ⇒ Object
call-seq: namespace.default_prefix = “string”.
-
#definitions ⇒ Array, XML::Namespace
Returns an array of XML::Namespace objects that are defined on this node.
-
#each {|XML::Namespace| ... } ⇒ Object
Iterates over the namespace objects that are in context for this node.
-
#find_by_href(href) ⇒ XML::Namespace
Searches for a namespace that has the specified href.
-
#find_by_prefix(prefix = nil) ⇒ XML::Namespace
Searches for a namespace that has the specified prefix.
-
#initialize(XML: :Node) ⇒ XML::Namespaces
constructor
Creates a new namespaces object.
-
#namespace ⇒ XML::Namespace
Returns the current node’s namespace.
-
#namespace=(XML) ⇒ Object
Sets the current node’s namespace.
-
#node ⇒ XML::Node
Returns the current node.
Constructor Details
#initialize(XML: :Node) ⇒ XML::Namespaces
Creates a new namespaces object. Generally you do not call this method directly, but instead access a namespaces object via XML::Node#namespaces.
Usage:
doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
namespaces = new XML::Namespaces(doc.root)
59 60 61 62 63 64 65 66 67 68 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 59
static VALUE rxml_namespaces_initialize(VALUE self, VALUE node)
{
xmlNodePtr xnode;
Check_Type(node, T_DATA);
Data_Get_Struct(node, xmlNode, xnode);
DATA_PTR(self) = xnode;
return self;
}
|
Instance Method Details
#default ⇒ Object
call-seq:
namespace.default -> XML::Namespace
Returns the default namespace for this node or nil.
Usage:
doc = XML::Document.string('<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"/>')
ns = doc.root.namespaces.default_namespace
assert_equal(ns.href, 'http://schemas.xmlsoap.org/soap/envelope/')
13 14 15 |
# File 'lib/libxml/namespaces.rb', line 13 def default find_by_prefix(nil) end |
#default_prefix=(prefix) ⇒ Object
call-seq:
namespace.default_prefix = "string"
Assigns a name (prefix) to the default namespace. This makes it much easier to perform XML::XPath searches.
Usage:
doc = XML::Document.string('<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"/>')
doc.root.namespaces.default_prefix = 'soap'
node = doc.root.find_first('soap:Envelope')
28 29 30 31 32 33 |
# File 'lib/libxml/namespaces.rb', line 28 def default_prefix=(prefix) # Find default prefix ns = find_by_prefix(nil) raise(ArgumentError, "No default namespace was found") unless ns Namespace.new(self.node, prefix, ns.href) end |
#definitions ⇒ Array, XML::Namespace
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 82
static VALUE rxml_namespaces_definitions(VALUE self)
{
xmlNodePtr xnode;
xmlNsPtr xns;
VALUE arr;
Data_Get_Struct(self, xmlNode, xnode);
arr = rb_ary_new();
xns = xnode->nsDef;
while (xns)
{
VALUE anamespace = rxml_namespace_wrap(xns, NULL);
rb_ary_push(arr, anamespace);
xns = xns->next;
}
return arr;
}
|
#each {|XML::Namespace| ... } ⇒ Object
Iterates over the namespace objects that are in context for this node.
Usage:
doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
doc.root.namespaces.each do |ns|
..
end
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 117
static VALUE rxml_namespaces_each(VALUE self)
{
xmlNodePtr xnode;
xmlNsPtr *nsList, *xns;
Data_Get_Struct(self, xmlNode, xnode);
nsList = xmlGetNsList(xnode->doc, xnode);
if (nsList == NULL)
return (Qnil);
for (xns = nsList; *xns != NULL; xns++)
{
VALUE ns = rxml_namespace_wrap(*xns, NULL);
rb_yield(ns);
}
xmlFree(nsList);
return Qnil;
}
|
#find_by_href(href) ⇒ XML::Namespace
Searches for a namespace that has the specified href. The search starts at the current node and works upward through the node’s parents. If a namespace is found, then an XML::Namespace instance is returned, otherwise nil is returned.
Usage:
doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
ns = doc.root.namespaces.find_by_href('http://schemas.xmlsoap.org/soap/envelope/')
assert_equal('soap', ns.prefix)
assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 156
static VALUE rxml_namespaces_find_by_href(VALUE self, VALUE href)
{
xmlNodePtr xnode;
xmlNsPtr xns;
Check_Type(href, T_STRING);
Data_Get_Struct(self, xmlNode, xnode);
xns = xmlSearchNsByHref(xnode->doc, xnode, (xmlChar*) StringValuePtr(href));
if (xns)
return rxml_namespace_wrap(xns, NULL);
else
return Qnil;
}
|
#find_by_prefix(prefix = nil) ⇒ XML::Namespace
Searches for a namespace that has the specified prefix. The search starts at the current node and works upward through the node’s parents. If a namespace is found, then an XML::Namespace instance is returned, otherwise nil is returned.
Usage:
doc = XML::Document.string('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"/>')
ns = doc.root.namespaces.find_by_prefix('soap')
assert_equal('soap', ns.prefix)
assert_equal('http://schemas.xmlsoap.org/soap/envelope/', ns.href)
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 188
static VALUE rxml_namespaces_find_by_prefix(VALUE self, VALUE prefix)
{
xmlNodePtr xnode;
xmlNsPtr xns;
xmlChar* xprefix = NULL;
if (!NIL_P(prefix))
{
Check_Type(prefix, T_STRING);
xprefix = (xmlChar*) StringValuePtr(prefix);
}
Data_Get_Struct(self, xmlNode, xnode);
xns = xmlSearchNs(xnode->doc, xnode, xprefix);
if (xns)
return rxml_namespace_wrap(xns, NULL);
else
return Qnil;
}
|
#namespace ⇒ XML::Namespace
223 224 225 226 227 228 229 230 231 232 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 223
static VALUE rxml_namespaces_namespace_get(VALUE self)
{
xmlNodePtr xnode;
Data_Get_Struct(self, xmlNode, xnode);
if (xnode->ns)
return rxml_namespace_wrap(xnode->ns, NULL);
else
return Qnil;
}
|
#namespace=(XML) ⇒ Object
Sets the current node’s namespace.
Basic usage:
# Create a node
node = XML::Node.new('Envelope')
# Define the soap namespace - this does *not* put the node in the namespace
ns = XML::Namespace.new(node, 'soap', 'http://schemas.xmlsoap.org/soap/envelope/')
assert_equal("<Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
# Now put the node in the soap namespace, not how the string representation changes
node.namespaces.namespace = ns
assert_equal("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"/>", node.to_s)
253 254 255 256 257 258 259 260 261 262 263 264 265 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 253
static VALUE rxml_namespaces_namespace_set(VALUE self, VALUE ns)
{
xmlNodePtr xnode;
xmlNsPtr xns;
Data_Get_Struct(self, xmlNode, xnode);
Check_Type(ns, T_DATA);
Data_Get_Struct(ns, xmlNs, xns);
xmlSetNs(xnode, xns);
return self;
}
|
#node ⇒ XML::Node
Returns the current node.
273 274 275 276 277 278 |
# File 'ext/libxml/ruby_xml_namespaces.c', line 273
static VALUE rxml_namespaces_node_get(VALUE self)
{
xmlNodePtr xnode;
Data_Get_Struct(self, xmlNode, xnode);
return rxml_node_wrap(xnode);
}
|