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:

https://www.discoduroderoer.es/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.

 

Etiquetas

Deja un comentario

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