XPath ancestor example
In this example we will learn how to get the ancestor details of a given node using XPath. We will start with the introduction of XPath – what it is and how to use it, then we will see the working model of the desired functionality.
Tools and technologies used in this example are Java 1.6, Maven, Intellij.(Please note you don’t need Maven to run this example. It can be run as standalone java application. You can use any IDE or even not use any if you want to.)
1. Overview
An XPath expression specifies a pattern that selects a set of XML nodes. XSLT templates then use those patterns when applying transformations. The nodes in an XPath expression refer to more than just elements. They also refer to text and attributes, among other things. In fact, the XPath specification defines an abstract document model that defines seven kinds of nodes:
- Root
- Element
- Text
- Attribute
- Comment
- Processing instruction
- Namespace
XPath also provides rules for converting a node in an XML document object model (DOM) tree to a boolean, double, or string value. XPath is a W3C-defined language and an official W3C recommendation; the W3C hosts the XML Path Language (XPath) Version 1.0 specification.
2. XPath Expressions
An XPath expression is composed of a location path and one or more optional predicates. Expressions may also include XPath variables.
The following is an example of a simple XPath expression:
/Country/City
This example would select the <City>
element in an XML document. A location path can be absolute or relative. An absolute location path starts with a slash ( / ) and a relative location path does not. In both cases the location path consists of one or more steps, each separated by a slash:
An axis defines a node-set relative to the current node.
AxisName | Result |
---|---|
ancestor | Selects all ancestors (parent, grandparent, etc.) of the current node |
ancestor-or-self | Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself |
3. Project Structure
Below is the project structure used in this example
4. XLM file
Below is the xml file representing Users. Each user has got a unique UserId, name, address, sex, Date Of Birth and email.
user.xml
<?xml version="1.0" encoding="UTF-8"?> <Users> <User> <UserId>12345</UserId> <Name> <FirstName>Maden</FirstName> <MiddleName>Over</MiddleName> <Surname>Gulliver</Surname> </Name> <Address> <FirstLineOfAddress>Oxford Street</FirstLineOfAddress> <SecondLineOfAddress></SecondLineOfAddress> <City>London</City> <County>Middlesex</County> <Country>United Kingdom</Country> </Address> <Sex>Male</Sex> <DateOfBirth>01/02/1967</DateOfBirth> <Email></Email> </User> <User> <UserId>56789</UserId> <Name> <FirstName>Tom</FirstName> <MiddleName>Cruise</MiddleName> <Surname>Kidman</Surname> </Name> <Address> <FirstLineOfAddress>Reagent Street</FirstLineOfAddress> <SecondLineOfAddress></SecondLineOfAddress> <City>New York</City> <County></County> <Country>United States</Country> </Address> <Sex>Female</Sex> <DateOfBirth>02/03/1978</DateOfBirth> <Email></Email> </User> <User> <UserId>72638</UserId> <Name> <FirstName>Amitabh</FirstName> <MiddleName></MiddleName> <Surname>Bachchan</Surname> </Name> <Address> <FirstLineOfAddress>Panama Street</FirstLineOfAddress> <SecondLineOfAddress></SecondLineOfAddress> <City>Mumbai</City> <County></County> <Country>India</Country> </Address> <Sex>Male</Sex> <DateOfBirth>05/04/1999</DateOfBirth> <Email>amitabh.bachchan@asv.com</Email> </User> </Users>
5. Java file
Below is the java file which will use XPath to extract information from the User.xml
.
ExampleXPathAncestor.java
package com.javacodegeeks; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.IOException; /** * Example code for XPath ancestor selection * @author Java Code Geeks */ public class ExampleXPathAncestor { private static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); private static DocumentBuilder builder = null; private static XPath xPath = null; private static Document document = null; public static void main(String q[]) { try { builder = builderFactory.newDocumentBuilder(); document = builder.parse(ExampleXPathAncestor.class.getResourceAsStream("/user.xml")); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } xPath = XPathFactory.newInstance().newXPath(); String expression = "//SecondLineOfAddress/ancestor::Address"; try { NodeList nl = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET); System.out.println(nl.getLength()); System.out.println(nl.item(0).getTextContent()); System.out.println(nl.item(1).getTextContent()); System.out.println(nl.item(3).getTextContent()); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
The expression //SecondLineOfAddress/ancestor::Address
will select the ancestor Address of SecondLineOfAddress.
6. Output
Run the ExampleXPathAncestor.java file. Below is the generated output.
3 Oxford Street London Middlesex United Kingdom Reagent Street New York United States
7. Download the source file
This was an example showing how to use XPath ansector.
You can download the full source code of this example here : XPath-ancestor