Leer XML en Java

Hola a todos, hoy os voy a explicar como podemos leer un XML con Java.

Ya vimos en el anterior post, como crear un XML con Java, aquí te lo dejo:

Crear XML en Java

Os dejo el XML que vamos a tratar, os recomiendo copiarlo y dejarlo en la raiz de vuestro proyecto


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<concesionario>
    <coches>
        <coche>
            <matricula>1111AAA</matricula>
            <marca>AUDI</marca>
            <precio>30000</precio>
        </coche>
        <coche>
            <matricula>2222BBB</matricula>
            <marca>SEAT</marca>
            <precio>10000</precio>
        </coche>
        <coche>
            <matricula>3333CCC</matricula>
            <marca>BMW</marca>
            <precio>20000</precio>
        </coche>
        <coche>
            <matricula>4444DDD</matricula>
            <marca>TOYOTA</marca>
            <precio>10000</precio>
        </coche>
    </coches>
</concesionario>

De primeras tenemos que usarla clase DocumentBuilderFactory y DocumentBuilder:


// Creo una instancia de DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Creo un documentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();

Con el objeto builder, podemos crear el objeto de la clase Document:


// Obtengo el documento, a partir del XML
Document documento = builder.parse(new File("concesionario.xml"));

Le damos el fichero XML como podéis ver.

Ahora vamos a coger todos los nodos con la etiqueta coche:


// Cojo todas las etiquetas coche del documento
NodeList listaCoches = documento.getElementsByTagName("coche");

 

Ya teniendo el NodeList, iremos recorriendo y cogiendo cada uno de ellos:


// Recorro las etiquetas
for (int i = 0; i &lt; listaCoches.getLength(); i++) {
    // Cojo el nodo actual
    Node nodo = listaCoches.item(i);

}

 

Aquí viene algo importante que debéis saber, los nodos que vamos recorriendo, no todos los nodos seran los hijos que vemos en el XML. Para no tener problemas, haremos esto:


// Recorro las etiquetas
for (int i = 0; i &lt; listaCoches.getLength(); i++) {
    // Cojo el nodo actual
    Node nodo = listaCoches.item(i);
    // Compruebo si el nodo es un elemento
    if (nodo.getNodeType() == Node.ELEMENT_NODE) {
        // Lo transformo a Element
        Element e = (Element) nodo;
        
    }

}

Con ese if, solucionamos el problema que comentamos, despues lo convertimos a Element, para coger a sus hijos.


// Recorro las etiquetas
for (int i = 0; i &lt; listaCoches.getLength(); i++) {
    // Cojo el nodo actual
    Node nodo = listaCoches.item(i);
    // Compruebo si el nodo es un elemento
    if (nodo.getNodeType() == Node.ELEMENT_NODE) {
        // Lo transformo a Element
        Element e = (Element) nodo;
        // Obtengo sus hijos
        NodeList hijos = e.getChildNodes();
        
    }

}

Y repito el mismo proceso de antes:


// Recorro las etiquetas
for (int i = 0; i &lt; listaCoches.getLength(); i++) {
    // Cojo el nodo actual
    Node nodo = listaCoches.item(i);
    // Compruebo si el nodo es un elemento
    if (nodo.getNodeType() == Node.ELEMENT_NODE) {
        // Lo transformo a Element
        Element e = (Element) nodo;
        // Obtengo sus hijos
        NodeList hijos = e.getChildNodes();
        // Recorro sus hijos
        for (int j = 0; j &lt; hijos.getLength(); j++) {
            // Obtengo al hijo actual
            Node hijo = hijos.item(j);
            // Compruebo si es un nodo
            if (hijo.getNodeType() == Node.ELEMENT_NODE) {

            }

        }
        System.out.println("");
    }

}

Ahora vamos a mostrar el nombre del nodo y su contenido:


// Recorro las etiquetas
for (int i = 0; i < listaCoches.getLength(); i++) {
    // Cojo el nodo actual
    Node nodo = listaCoches.item(i);
    // Compruebo si el nodo es un elemento
    if (nodo.getNodeType() == Node.ELEMENT_NODE) {
        // Lo transformo a Element
        Element e = (Element) nodo;
        // Obtengo sus hijos
        NodeList hijos = e.getChildNodes();
        // Recorro sus hijos
        for (int j = 0; j < hijos.getLength(); j++) {
            // Obtengo al hijo actual
            Node hijo = hijos.item(j);
            // Compruebo si es un nodo
            if (hijo.getNodeType() == Node.ELEMENT_NODE) {
                // Muestro el contenido
                System.out.println("Propiedad: " + hijo.getNodeName() + ", Valor: " + hijo.getTextContent());
            }

        }
        System.out.println("");
    }

}

 

Este es el resultado:

Os dejo el ejemplo completo:



package ejercicio_xml_discoduroderoer_02;

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Ejercicio_XML_Discoduroderoer_02 {

    public static void main(String[] args) {

        try {
            // Creo una instancia de DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // Creo un documentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();

            // Obtengo el documento, a partir del XML
            Document documento = builder.parse(new File("concesionario.xml"));

            // Cojo todas las etiquetas coche del documento
            NodeList listaCoches = documento.getElementsByTagName("coche");

            // Recorro las etiquetas
            for (int i = 0; i < listaCoches.getLength(); i++) {
                // Cojo el nodo actual
                Node nodo = listaCoches.item(i);
                // Compruebo si el nodo es un elemento
                if (nodo.getNodeType() == Node.ELEMENT_NODE) {
                    // Lo transformo a Element
                    Element e = (Element) nodo;
                    // Obtengo sus hijos
                    NodeList hijos = e.getChildNodes();
                    // Recorro sus hijos
                    for (int j = 0; j < hijos.getLength(); j++) {
                        // Obtengo al hijo actual
                        Node hijo = hijos.item(j);
                        // Compruebo si es un nodo
                        if (hijo.getNodeType() == Node.ELEMENT_NODE) {
                            // Muestro el contenido
                            System.out.println("Propiedad: " + hijo.getNodeName()
                                    + ", Valor: " + hijo.getTextContent());
                        }

                    }
                    System.out.println("");
                }

            }

        } catch (ParserConfigurationException | SAXException | IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

}


Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

 

Compartir

1 comentario

  1. Roberto

    Pues muchas gracias por el trabajo, me esá sirviendo enormemente.

    He visto y estudiado tus publicaciones sobre crear y leer un fichero xml.

    Podría decirme que instrucciones se deberían de usar para:
    – agregar nuevos datos (por ejemplo un nuevo coche)
    – buscar un coche concreto y sacarlo por pantalla (solo uno)
    – buscar un coche concreto y poder editarlo y/o eliminarlo

    Un saludo y muchas gracias por tus primordiales clases

Deja una respuesta

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