Evaluador XPath en Java

Como sabemos, el documento XML se utiliza para almacenar y transportar datos. Entonces, para acceder a los datos de XML, necesitamos algo que pueda acceder a cada Node y a los datos de los atributos respectivos. Entonces la solución es XPath. XPath se puede utilizar para recorrer documentos XML, seleccionar Nodes/elementos y datos de atributos. Es una recomendación del W3C y una forma flexible de acceder a diferentes partes de un documento XML. Escribir XPath es similar a escribir una expresión de ruta en su sistema informático para atravesar una ubicación específica como (C:/School/Homework/assignment.docx). 

Considere el siguiente documento XML

XML

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student branch="CSE">
        <name>Divyank Singh Sikarwar</name>
        <age>18</age>
        <city>Agra</city>
    </student>
    <student branch="CSE">
        <name>Aniket Chauhan</name>
        <age>20</age>
        <city>Shahjahanpur</city>
    </student>
    <student branch="CSE">
        <name>Simran Agarwal</name>
        <age>23</age>
        <city>Buland Shar</city>
    </student>
    <student branch="CSE">
        <name>Abhay Chauhan</name>
        <age>17</age>
        <city>Shahjahanpur</city>
    </student>
    <student branch="IT">
        <name>Himanshu Bhatia</name>
        <age>25</age>
        <city>Indore</city>
    </student>
    <student branch="IT">
        <name>Anuj Modi</name>
        <age>22</age>
        <city>Ahemdabad</city>
    </student>
    <student branch="ECE">
        <name>Manoj Yadav</name>
        <age>23</age>
        <city>Kota</city>
    </student>  
</students>

Símbolos XPath que se utilizan para acceder a diferentes partes de un documento XML:

Símbolo

Descripción

Ejemplo

Resultado

nombre Selecciona todas las etiquetas de XML que tienen el nombre ‘nombre’ /estudiantes/estudiante/nombre Muestra todos los nombres
/ Esto representa la raíz del documento. /estudiantes/estudiante/ciudad Mostrar la ciudad de cada estudiante
// Selecciona el Node independientemente de dónde se encuentre. //años Selecciona y muestra todas las edades.
@ Para acceder al valor del atributo de las etiquetas XML /estudiantes/estudiante/@sucursal Mostrar la rama de cada alumno
[ ]  Se utiliza para seleccionar Nodes específicos. /estudiantes/estudiante[2]/nombre Expositores Aniket Chauhan

Practiquemos XPath

Considere el documento XML mencionado anteriormente:

Seleccionar segundo estudiante

/estudiantes/estudiante[2]/nombre

Seleccione todos los estudiantes con rama TI

/estudiantes/estudiante[@branch = /”IT/”]/nombre

Seleccionar todos los alumnos cuya edad sea menor que igual a 20

/estudiantes/estudiante[edad <= 20]/nombre

Primeros 4 estudiantes

/estudiantes/estudiante[posición() <= 4]/nombre

Código Java para evaluar la expresión XPath

Java

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.NodeList;
  
public class XPathDemo {
  
    public static void main(String[] args) throws Exception
    {
        File xmlFile = new File("student.xml");
        
        // Get DOM
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document xml = db.parse(xmlFile);
        xml.getDocumentElement().normalize();
  
        // Get XPath
        XPathFactory xpf = XPathFactory.newInstance();
        XPath xpath = xpf.newXPath();
  
        // Find 2nd Student's name
        String name = (String)xpath.evaluate(
            "/students/student[2]/name", xml,
            XPathConstants.STRING);
  
        System.out.println("2nd Student Name: " + name);
  
        // find specific students name whose branch is IT
        NodeList nodes = (NodeList)xpath.evaluate(
            "/students/student[@branch = \"IT\"]/name", xml,
            XPathConstants.NODESET);
  
        System.out.println("\nStudents with branch IT:");
        printNodes(nodes);
  
        // find specific students 
        // name whose age is less
        // than equal to 20
        nodes = (NodeList)xpath.evaluate(
            "/students/student[age <= 20]/name", xml,
            XPathConstants.NODESET);
  
        System.out.println(
            "\nStudents of age less than equal to 20:");
        printNodes(nodes);
  
        // First 4 students from XML document
        nodes = (NodeList)xpath.evaluate(
            "/students/student[position() < 5]/name", xml,
            XPathConstants.NODESET);
  
        System.out.println("\nFirst Four Students: ");
        printNodes(nodes);
    }
      
    // prints nodes
    public static void printNodes(NodeList nodes)
    {
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(
                (i + 1) + ". "
                + nodes.item(i).getTextContent());
        }
    }
}

Producción:

Explicación de clases y métodos utilizados en el código anterior:

  • La clase javax.xml.Parsers.DocumentBuilder define la API para obtener instancias DOM de un documento XML.
  • El método parse() analiza el contenido del archivo dado como un documento XML y devuelve un nuevo objeto DOM.
  • El método normalize() normaliza el contenido del archivo dado como un documento XML.
  • La instancia de la clase javax.xml.xpath.XPathFactory se puede usar para crear objetos XPath que contienen el método de evaluación() para evaluar nuestro xpath escrito y devolver string/Node/Conjunto de Nodes, cualquiera, de acuerdo con el parámetro pasado (consulte el método de evaluación() dentro código).
  • position() es una función XPath que devuelve la posición de la etiqueta especificada actualmente. (En el código anterior, la etiqueta especificada es ‘estudiante’). Del mismo modo, XPath proporciona una lista de funciones útiles, puede explorarla.

Publicación traducida automáticamente

Artículo escrito por prakhargupta24 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *