Module: LibXML::XML::XPath
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Defined in: | ext/libxml/ruby_xml_xpath.c |
Overview
The XPath module is used to query ::LibXML::XML documents. It is usually accessed via the Document#find or Node#find methods. For example:
document.find('/foo', namespaces) -> XML::XPath::Object
The optional namespaces parameter can be a string, array or hash table.
document.find('/foo', 'xlink:http://www.w3.org/1999/xlink')
document.find('/foo', ['xlink:http://www.w3.org/1999/xlink',
'xi:http://www.w3.org/2001/XInclude')
document.find('/foo', 'xlink' => 'http://www.w3.org/1999/xlink',
'xi' => 'http://www.w3.org/2001/XInclude')
Working With Default Namespaces
Finding namespaced elements and attributes can be tricky. Lets work through an example of a document with a default namespace:
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">Phil Bogle's Contacts</title>
</feed>
To find nodes you must define the atom namespace for libxml. One way to do this is:
node = doc.find('atom:title', 'atom:http://www.w3.org/2005/Atom')
Alternatively, you can register the default namespace like this:
doc.root.namespaces.default_prefix = 'atom'
node = doc.find('atom:title')
More Complex Namespace Examples
Lets work through some more complex examples using the following xml document:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getManufacturerNamesResponse xmlns="http://services.somewhere.com">
<IDAndNameList xmlns="http://services.somewhere.com">
<ns1:IdAndName xmlns:ns1="http://domain.somewhere.com"/>
</IDAndNameList>
</getManufacturerNamesResponse>
</soap:Body>
</soap:Envelope>
# Since the soap namespace is defined on the root
# node we can directly use it.
doc.find('/soap:Envelope')
# Since the ns1 namespace is not defined on the root node
# we have to first register it with the xpath engine.
doc.find('//ns1:IdAndName',
'ns1:http://domain.somewhere.com')
# Since the getManufacturerNamesResponse element uses a default
# namespace we first have to give it a prefix and register
# it with the xpath engine.
doc.find('//ns:getManufacturerNamesResponse',
'ns:http://services.somewhere.com')
# Here is an example showing a complex namespace aware
# xpath expression.
doc.find('/soap:Envelope/soap:Body/ns0:getManufacturerNamesResponse/ns0:IDAndNameList/ns1:IdAndName',
['ns0:http://services.somewhere.com', 'ns1:http://domain.somewhere.com'])
Constant Summary
-
BOOLEAN =
# File 'ext/libxml/ruby_xml_xpath.c', line 180
A boolean value.
2 -
LOCATIONSET =
# File 'ext/libxml/ruby_xml_xpath.c', line 190
An xpointer location set
7 -
NODESET =
# File 'ext/libxml/ruby_xml_xpath.c', line 178
A nodeset, will be wrapped by
XPathObject.1 -
NUMBER =
# File 'ext/libxml/ruby_xml_xpath.c', line 182
A numeric value.
3 -
POINT =
# File 'ext/libxml/ruby_xml_xpath.c', line 186
An xpointer point
5 -
RANGE =
# File 'ext/libxml/ruby_xml_xpath.c', line 188
An xpointer range
6 -
STRING =
# File 'ext/libxml/ruby_xml_xpath.c', line 184
A string value.
4 -
UNDEFINED =
# File 'ext/libxml/ruby_xml_xpath.c', line 176
Undefined value.
0 -
USERS =
# File 'ext/libxml/ruby_xml_xpath.c', line 192
XPathuser type8 -
XSLT_TREE =
# File 'ext/libxml/ruby_xml_xpath.c', line 194
An XSLT value tree, non modifiable
9