12.2. Querying an Object Graph with XPath

Problem

You need to retrieve nested bean properties using an XPath expression. You need to perform an XPath query on an object graph.

Solution

Use Commons JXPath to evaluate an XPath expression against an object graph. JXPath treats nested bean properties as if they were nested elements in an XML document; using JXPath, the expression a/b/c is the equivalent of getA( ).getB( ).getC( ). Create a JXPathContext by passing an object to JXPathContext.newContext( ), and retrieve the value of a nested property by passing an XPath expression to the getValue( ) method on JXPathContext. The following example creates an object graph rooted on a League object and retrieves nested properties using two XPath expressions:

import org.apache.commons.jxpath.JXPathContext;

// Create an Object graph
League league = new League( );

Team team = new Team( );
league.getTeams( ).add( team );
        
team.setCoach( new Person( "Coach Bob" ) );
team.getPlayers( ).add( new Person( "Player Charlie" );
team.getPlayers( ).add( new Person( "Player Ted" );
team.getPlayers( ).add( new Person( "Player Bart" );

Team team2 = new Team( );
league.getTeams( ).add( team2 );
        
team2.setCoach( new Person( "Coach Susan" );
team2.getPlayers( ).add( new Person( "Player Jim" );

// Query for the coach of a specific player.
JXPathContext context = JXPathContext.newContext( league );
System.out.println( "** Retrieve the first name of Ted's coach");
String xpath = "teams/players[firstName = 'Player ...

Get Jakarta Commons Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.