HTML 4.01 strict HTML
Visit Sourceforge.net

This page is the XPath Contributed Add-on Documentation main page.

With the XPath Contributed Add-on, the following is added to the W3C DOM parser:

  • DOMNode is extended to support a new function (selectNodeSet) that allows for XPath expressions to be used on that node's child nodes.
  • A new class, XPATHNodeSet that descends from DOMNodeList that is the result of the new DOMNode.selectNodeSet call. In addition to the capabilities provided by DOMNodeList, this class includes new functionality specific to filtering an XPath result set.

Full documentation of the XPath Contributed Add-on follows:

CONTENTS
How do I get started with XPath?
What XPath expressions are supported?
How complete is the XPath processor?
What files do I need to include to use XPATH?
What are the known limitations with the XPath processor?
 
DOMNode Extensions
DOMNode - selectNodeSet method
 
XPATHNodeSet
XPATHNodeSet object description
 
XPATHNodeSet (Native Methods)
XPATHNodeSet - getNamedItems method
XPATHNodeSet - getTypedItems method
 
XPATHNodeSet (Inherited Methods)
DOMNodeList - getLength method
DOMNodeList - item method
How do I get started with XPath?

It's actually very easy. A nice XPath tutorial is available from zvon.org for those not familiar with XPath.

XML for <SCRIPT>'s XPath Contributed Add-on extends the W3C DOMNode class to incorporate a new method (selectNodeSet) in which an XPath expression can be applied to the node's children and a new class (XPATHNodeSet) returned based on the results of the XPath expression. Please see the following example for a demonstration.

NOTE: A large number of sample XPath example expressions are available by viewing the XPath Sample Code Page and launching the "XPath Sample Application - Sample Queries" application.

Example:
function xmljsDOMExample() {
var xml;
xml = ""
+ "<?xml version=\"1.0\"?>"
+ "<ROOT>"
+ "<TAG1>"
+ "Hello World"
+ "</TAG1>"
+ "</ROOT>";

//instantiate the W3C DOM Parser
var parser = new DOMImplementation();

//load the XML into the parser and get the DOMDocument
var domDoc = parser.loadXML(xml);

//get the document root
var docRoot = domDoc.getDocumentElement();

//get the TAG1 node via XPath

//start by calling selectNodeSet
//remember, docRoot is a DOMNode
var result = docRoot.selectNodeSet("//TAG1");

//get the TAG1 node from the XPATHNodeSet
var tag1 = result.item(0);

//get the "Hello World" text
var textNode = tag1.getFirstChild();

//the following should be "Hello World"
alert(textNode.toString());

}// end function xmljsDOMExample

What XPath expressions are supported?

Although the XPath Contributed Add-on does not attempt to be fully W3C complient, most of the common XPath expressions are supported. The list of supported expressions is shown below:

  • Ordinal queries like //tag1[1]
  • position() queries like //tag1[position()=1]
  • last() queries like //tag1[position=()last()]
  • not() queries like //tag1[not(position()=1)]
  • text() queries like //tag1/text()
  • comment() queries like //tag1/comment()
  • node() queries like //tag1/node()
  • processing-instruction() queries like //tag1/processing-instruction()
  • wild card queries like //tag1/*
  • attribute queries like //@* or //@id
  • attribute subqueries like //tag1[@id=1]
  • count() subqueries like //tag1[count(a)=3]

NOTE: The XPath processor does not support the use of the "or" (|) operator.

NOTE: A large number of sample XPath example expressions are available by viewing the XPath Sample Code Page and launching the "XPath Sample Application - Sample Queries" application.

How complete is the XPath processor?

While providing support for what should be the majority of the functionality needed for the most common uses of XPath, please keep in mind that the XPath Contributed Add-on is not fully compliant to the W3C XPath specificication and has known limitations. Please read the documentation and ensure any XPath expressions you intend to use are supported before using the XPath Contributed Add-on.

What files do I need to include to use XPATH?

In order to use XML for <SCRIPT>'s XPath Contributed Add-on, you must include the following .js file in your HTML Pages. The .js file starting with "tiny" has been compressed for faster downloads and are functionally identical to their non-compressed counterparts. The non compressed files may be found in the contributedAdd-ons/xpath/xpathProcessorSource directory. The compressed files may be found in the contributedAddonsjsXMLParser/compressed directory.

The XPath Contributed Add-on has been "crunched" using the Creativyst®JavaScript Compressor at creativyst.com.

  • xmlxpath.js (or tinyxmlxpath.js)

NOTE: XML for <SCRIPT>'s XPath processor is only designed to work with the W3C Parser. It does not function with the Classic DOM parser. If you are using the Classic DOM parser, please use that parser's TagPath functionality which is similar to XPath.

What are the known limitations with the XPath processor?

XML for <SCRIPT>'s XPath Contributed Add-on has the following known limitations:

  • No native support for namespaces (see workaround below)
  • Not fully compliant to the W3C Spec (see the list of supported XPath expressions)
  • Wild-card searches do not always work as expected. For example, the expression //*[count(*)=3] should return any node that has three children. This expression does not work in the XPath Contributed Add-on.

NOTE: Even though the XPath Contributed Add-on does not natively support namespaces, it is still possible to use XPath with namespaces if namespace information is included as part of the XPath expression. See the example below.

Example:
function xmljsDOMExample() {
var xml;
xml = ""
+ "<?xml version=\"1.0\"?>"
+ "<ns1:ROOT xmlns:ns1=\"foo\">"
+ "<ns1:TAG1>"
+ "<ns1:A>data</ns1:A>"
+ "<ns1:B>data</ns1:B>"
+ "<ns1:A>data</ns1:A>"
+ "<ns1:B>data</ns1:B>"
+ "<ns1:A>data</ns1:A>"
+ "</ns1:TAG1>"
+ "</ns1:ROOT>";

//instantiate the W3C DOM Parser
var parser = new DOMImplementation();

//load the XML into the parser and get the DOMDocument
var domDoc = parser.loadXML(xml);

//get the document root
var docRoot = domDoc.getDocumentElement();

//start by calling selectNodeSet
//to return all the nodes under ns1:TAG1
//remember, docRoot is a DOMNode
var xpNSAll = docRoot.selectNodeSet("//ns1:TAG1/*");

//the following should be 5
alert(xpNSAll.getLength());

//now get only the "A" nodes
var xpNSANodes = xpNSAll.getNamedItems("ns1:A");

//the following should be 3
alert(xpNSANodes.getLength());

}// end function xmljsDOMExample

DOMNode - selectNodeSet method

domNode.selectNodeSet(<XPathExpression>);

accepts:
String - The XPath expression to execute on the DOMNode

returns:
XPATHNodeSet - The XPATHNodeSet with the results of the XPath query.

- or -

null - if an error was reported during the execution of the expression

throws:
N/A

XML for <SCRIPT>'s XPath Contributed Add-on extends the W3C DOMNode class to incorporate a new method (selectNodeSet) in which an XPath expression can be applied to the node's children and a new class (XPATHNodeSet) returned based on the results of the XPath expression.

NOTE: An XPath expression that returns zero nodes is not considered an error condition. In this case, DOMNode.selectNodeSet will return an XPATHNodeSet with zero items.

NOTE: A large number of sample XPath example expressions are available by viewing the XPath Sample Code Page and launching the "XPath Sample Application - Sample Queries" application.

Example:
function xmljsDOMExample() {
var xml;
xml = ""
+ "<?xml version=\"1.0\"?>"
+ "<ROOT>"
+ "<TAG1>"
+ "Hello World"
+ "</TAG1>"
+ "</ROOT>";

//instantiate the W3C DOM Parser
var parser = new DOMImplementation();

//load the XML into the parser and get the DOMDocument
var domDoc = parser.loadXML(xml);

//get the document root
var docRoot = domDoc.getDocumentElement();

//get the TAG1 node via XPath

//start by calling selectNodeSet
//remember, docRoot is a DOMNode
var result = docRoot.selectNodeSet("//TAG1");

//get the TAG1 node from the XPATHNodeSet
var tag1 = result.item(0);

//get the "Hello World" text
var textNode = tag1.getFirstChild();

//the following should be "Hello World"
alert(textNode.toString());

}// end function xmljsDOMExample

XPATHNodeSet object description

XPATHNodeSet descends from DOMNodeList and is the object returned when DOMNode.selectNodeSet is called. In addition to the capabilities provided by DOMNodeList, this class includes new functionality specific to filtering an XPath result set.

XPATHNodeSet - getNamedItems method

XPATHNodeSet.getNamedItems(<name>);

accepts:
String - The name of the DOMNodes to search for

returns:
XPATHNodeSet - The XPATHNodeSet with the results of the query.

throws:
N/A

getNamedItems allows developers to get a subset of the nodes inside an XPATHNodeSet based on the node names of the DOMNodes in the original XPATHNodeSet.

Example:
function xmljsDOMExample() {
var xml;
xml = ""
+ "<?xml version=\"1.0\"?>"
+ "<ROOT>"
+ "<TAG1>"
+ "<A>data</A>"
+ "<B>data</B>"
+ "<A>data</A>"
+ "<B>data</B>"
+ "<A>data</A>"
+ "</TAG1>"
+ "</ROOT>";

//instantiate the W3C DOM Parser
var parser = new DOMImplementation();

//load the XML into the parser and get the DOMDocument
var domDoc = parser.loadXML(xml);

//get the document root
var docRoot = domDoc.getDocumentElement();

//start by calling selectNodeSet
//to return all the nodes under TAG1
//remember, docRoot is a DOMNode
var xpNSAll = docRoot.selectNodeSet("//TAG1/*");

//the following should be 5
alert(xpNSAll.getLength());

//now get only the "A" nodes
var xpNSANodes = xpNSAll.getNamedItems("A");

//the following should be 3
alert(xpNSANodes.getLength());

}// end function xmljsDOMExample

XPATHNodeSet - getTypedItems method

XPATHNodeSet.getTypedItems(<type>);

accepts:
String - The type of DOMNode to search for

returns:
XPATHNodeSet - The XPATHNodeSet with the results of the query.

throws:
N/A

getTypedItems allows developers to get a subset of the nodes inside an XPATHNodeSet based on the node type of the DOMNodes in the original XPATHNodeSet. The available types to search on are:

  • "text"
  • "comment"
  • "processing-instruction"
  • "node"

If a type other than the ones above is passed in, an empty XPATHNodeSet is returned.

Example:
function xmljsDOMExample() {
var xml;
xml = ""
+ "<?xml version=\"1.0\"?>"
+ "<ROOT>"
+ "<TAG1>"
+ "text node"
+ "<!--comment node-->"
+ "<? piTarget piData ?>"
+ "</TAG1>"
+ "</ROOT>";

//instantiate the W3C DOM Parser
var parser = new DOMImplementation();

//load the XML into the parser and get the DOMDocument
var domDoc = parser.loadXML(xml);

//get the document root
var docRoot = domDoc.getDocumentElement();

//start by calling selectNodeSet
//to return all the nodes under TAG1
//remember, docRoot is a DOMNode
var xpNSAll = docRoot.selectNodeSet("//TAG1/*");

//now get only the text node
var xpNSTextItem = xpNSAll.getTypedItems("text");

//the following should be "text node"
alert(xpNSTextItem.item(0).getData());

//now get the comment node
var xpNSCommentItem = xpNSAll.getTypedItems("comment");

//the following should be "comment node"
alert(xpNSCommentItem.item(0).getData());

//now get the processing instruction node
var pi = "processing-instruction";
var xpNSPIItem = xpNSAll.getTypedItems(pi);

//the following should be "piData"
alert(xpNSPIItem.item(0).getData());

//get all nodes
var xpNSNodeItems = xpNSAll.getTypedItems("node");

//the following should be 3
alert(xpNSNodeItems.getLength());

}// end function xmljsDOMExample