XPath

XPath starts-with example

In this example we will learn how to use starts-with function of 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 ‘starts-with’ function.

Tools and technologies used in this example are Java 1.7, Maven, Intellij.

1. Overview

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

3. Project Structure

Below is the project structure used in this example

Figure 1. Project Structure
Figure 1. Project Structure

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. We will try to extract the country names that starts with ‘United‘.

ExampleXPathStartsWith.java

package com.javacodegeeks;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
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.FileNotFoundException;
import java.io.IOException;

/**
 * Example class for describing how the XPath starts-with function works.
 * @author JavaCodeGeeks
 */
public class ExampleXPathStartsWith {

    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;

    public static void main(String q[]) {
        ExampleXPathStartsWith exampleXPathStartsWith = new ExampleXPathStartsWith();
        exampleXPathStartsWith.execute();
    }

    public void execute() {
        try {
            builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(this.getClass().getResourceAsStream("/user.xml"));
            XPath xPath =  XPathFactory.newInstance().newXPath();
            String expression = "//User/Address/Country[starts-with(.,'United')]";

            //read a string value
            NodeList nl = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
            for(int i=0; i < nl.getLength() ; i++) {
                Node node = nl.item(i);
                System.out.println(node.getTextContent());
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }
    }
}

First we create a reference of DocumentBuilderFactory by calling the static newInstance method of it.

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

Then we create a DocumentBuilder object by calling newDocumentBuilder() method on the factory object.

DocumentBuilder builder = builderFactory.newDocumentBuilder();

Then we call the parse() method on this builder object by passing in the xml file that we pant to parse.

Document document = builder.parse(this.getClass().getResourceAsStream("/user.xml"));

Then we create a XPath object:

XPath xPath =  XPathFactory.newInstance().newXPath();

We will call the compile() method on this XPath object by passing in the expression and then call the evaluate() method. This will return is the list of nodes from the target xml.

NodeList nl = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);

Then we will iterate these nodes to print the text content

System.out.println(node.getTextContent());

6. Output

Run the ExampleXPathStartsWith.java file.  Below is the generated output.

United Kingdom
United States

Process finished with exit code 0

7. Download the source file

This was an example of XPath starts-with function.

Download
You can download the full source code of this example here: XPath-starts-with.zip

Mohammad Meraj Zia

Senior Java Developer
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button