Using XPath to Retrieve Element Content
Prev |  | Next

## Using XPath to Retrieve Element Content

In addition to walking the document tree to find an element, Libxml2 includes support for use of XPath expressions to retrieve sets of nodes that match a specified criteria. Full documentation of the XPath API is here.

XPath allows searching through a document for nodes that match specified criteria. In the example below we search through a document for the contents of all `keyword` elements.

| Note
A full discussion of XPath is beyond the scope of this document. For details on its use, see the XPath specification.

Full code for this example is at Appendix D, Code for XPath Example.

Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the context to the `xmlXPathEvalExpression` function. The function returns an xmlXPathObjectPtr, which includes the set of nodes satisfying the XPath expression.

    	xmlXPathObjectPtr
    	getnodeset (xmlDocPtr doc, xmlChar *xpath){

    	xmlXPathContextPtr context;
    	xmlXPathObjectPtr result;

    	context = xmlXPathNewContext(doc);
    	result = xmlXPathEvalExpression(xpath, context);
    	if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
    		xmlXPathFreeObject(result);
                    printf("No result\n");
    		return NULL;

| First we declare our variables.
| Initialize the `context` variable.
| Apply the XPath expression.
| Check the result and free the memory allocated to `result` if no result is found.

The xmlPathObjectPtr returned by the function contains a set of nodes and other information needed to iterate through the set and act on the results. For this example, our functions returns the `xmlXPathObjectPtr`. We use it to print the contents of `keyword` nodes in our document. The node set object includes the number of elements in the set (`nodeNr`) and an array of nodes (`nodeTab`):

    	for (i=0; i < nodeset->nodeNr; i++) {
    	keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
    		printf("keyword: %s\n", keyword);
    	        xmlFree(keyword);
    	}

| The value of `nodeset->Nr` holds the number of elements in the node set. Here we use it to iterate through the array.

Here we print the contents of each of the nodes returned.

| Note
Note that we are printing the child node of the node that is returned, because the contents of the `keyword` element are a child text node.

Prev | Up | Next
Retrieving Element Content | Home | Writing element content