XPath en Java

dotr

Cuando trabajamos con XML queremos poder acceder  a cada una de las partes que componen el fichero, para poder tratar cada uno de los elementos de forma diferente. Para seleccionar información dentro de un fichero XML utilizamos XPath (XML Path Language), con el podremos seleccionar y hacer referencia a texto, elementos, atributos u otra información dentro del fichero.

XPath es un lenguaje complejo distinto de otros lenguajes como C, Basic o Java. Se utiliza como base para nuevas herramientas para el tratamiento de documentos XML. Las clases que utilizaremos para trabajar con XPath en Java se encuentran en el paquete javax.xml.xpath. Con la clase XPathFactory crearemos una instancia de XPath, con esta instancia podremos crear un objeto de la clase XPathExpression que utilizaremos para realizar las consultas.

//Creando la Instacia xPath
 XPath xPath = XPathFactory.newInstance().newXPath();
 //Creando la expresión con la QUERY en sintaxis XPath
 XPathExpression expression = xPath.compile( QUERY );
 //Ejecutando la consulta y recuperando el resultado
 TYPE value = (TYPE) expression.evaluate(DOCUMENTO_XML, XPathConstants.TYPE);

Cuando trabajamos con XPath utilizaremos una cadena que contendrá la estructura de nodos que vamos a buscar separados por”/”. La forma de trabajar es similar a trabajar con SQL.

  • /library/authors -> Me retornará el Nodo <authors> con todos sus nodos hijos.
  • /library/descedant::/title -> Me retornará toda la lista de nodos <title> sean hijos, nietos, bisnietos … es decir, todos los del documento, sin importar el nivel.
  • /library/books/book/title -> Me retornará la lista de todos los nodos <title> que están dentro de los nodos <book>. (¿Si notan la diferencia con respecto al anterior?)
  • count(/library/descedant::/author) -> Cuenta cuántos autores hay.
  • /library/descendant::author[ @id = 1 ] -> El nodo author que tiene el atributo id = 1. Es como hace un SQL con un WHERE.

Ejemplo:

public static void gettingBooksInformation(Document xml){
 ---String countBooks = "count(/library/descendant::book)";
 ---String getBooks = "/library/descendant::book";
 ---String getAuthorWithId = "/library/descendant::author[@id = ";
---XPath xPath = XPathFactory.newInstance().newXPath();
 ---try {
 ------XPathExpression expression = xPath.compile(countBooks);
 ------Number countNodes = (Number) expression.evaluate(xml, XPathConstants.NUMBER);
 ------System.out.println("Number of books: " + countNodes.intValue());
------expression = xPath.compile(getBooks);
 ------NodeList books = (NodeList) expression.evaluate(xml, XPathConstants.NODESET);
 ------for(int i = 0; i < books.getLength(); i++){
---------System.out.println( "Book #" + (i+1) );
---------NodeList bookAttributs = books.item(i).getChildNodes();
 ---------System.out.println( "Title: " + bookAttributs.item(0).getTextContent() );
---------expression = xPath.compile(getAuthorWithId + bookAttributs.item(1).getTextContent() + "]" );
 ---------Node author = (Node) expression.evaluate(xml, XPathConstants.NODE);
---------System.out.println( "Author: " + author.getTextContent() );
 ------}
 ---} catch (Exception e) {
 ------System.out.println(e.getMessage());
 ------e.printStackTrace(System.out);
 ---}
 }
Anuncios

Publicado el 17/11/2013 en AD y etiquetado en , . Guarda el enlace permanente. Comentarios desactivados en XPath en Java.

Los comentarios están cerrados.

A %d blogueros les gusta esto: