Baran Topal

Baran Topal


May 2024
M T W T F S S
« Feb    
 12345
6789101112
13141516171819
20212223242526
2728293031  

Categories


Finding specific XML element with XPath in Java

baranbaran

Long ago, I needed to find specific XML element with XPath in Java. Here you go:

package xpath;

import java.io.IOException;
import java.io.StringReader;

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.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class TestXPath {

 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
 String xml =
"<someRootElement>" +
"<bases>" +

"<base>" +
"<name>jazzz</name>" +
"<description>hello</description>" +
"<level1>" +
"<level2>" +
"<name>Hi</name>" +
"<value>1.5</value>" +
"</level2>" +
"<level2>" +
"<name>Hello</name>" +
"<value>0</value>" +
"</level2>" +
"<level2>" +
"<name>There</name>" +
"<value>24</value>" +
"</level2>" +
"</level1>" +
"</base>" +

"<base>" +
"<name>baran</name>" +
"<description>goodbye</description>" +
"<level1>" +
"<level2>" +
"<name>Hi</name>" +
"<value>1.5</value>" +
"</level2>" +
"<level2>" +
"<name>Hello</name>" +
"<value>0</value>" +
"</level2>" +
"<level2>" +
"<name>There</name>" +
"<value>24</value>" +
"</level2>" +
"</level1>" +
"</base>" +

"</bases>" +
"</someRootElement>"
;
 
 // Build a 'Document' instance to represent the XML (note that this could come from a File of via a Socket in a networked app)
 Document doc = builder.parse(new InputSource(new StringReader(xml)));
 
 
 // Create the XPath objects ahead of time
 XPath xPath = XPathFactory.newInstance().newXPath();
 XPathExpression baseExpr = xPath.compile("//base");
 XPathExpression nameExpr = xPath.compile("name");
 XPathExpression descExpr = xPath.compile("description");
 
 // Get the list of 'base' elements from 'doc'
 NodeList nodeset = (NodeList) baseExpr.evaluate(doc, XPathConstants.NODESET);
 
 for (int i = 0; i < nodeset.getLength(); i++) {
 Node node = nodeset.item(i);
 
 // For each 'base' Node, evaluate the expressions to retrieve 'name' and 'description'
 String name = nameExpr.evaluate(node);
 String desc = descExpr.evaluate(node);
 
 // Show the result
 System.out.println("Name = '" + name + "', Description = '" + desc + "'");
 }
 }

}