Como recorrer un XML de forma recursiva en Java

Hola a todos, hoy os voy a explicar como podemos recorrer un XML de forma recursiva en Java.

Si alguna vez has recorrido un XML en Java de forma manual, habrás pensado que pasaría si tuviéramos un XML con muchos elementos internos, ya que podemos poner todos los elementos hijos.

Por eso lo recomendable es recorrerlo de forma recursiva.

La idea es que dado un nodo, recorrer sus nodos hijos, si ese nodo hijo es un nodo, llamo de nuevo a la función recursivamente.

Si tiene atributos, lo trataríamos de la misma forma, como si fuera un nodo.

En el caso de que sea un nodo de texto, muestro el contenido.

Este es el XML que vamos a utilizar:


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

Os dejo la función:


public static void loopNodeXml(Node n) {
public static void loopNodeXml(Node n) {

    // Mostramos el nombre del nodo
    System.out.println(n.getNodeName());

    // Obtenemos sus hijos
    NodeList hijos = n.getChildNodes();
    for (int i = 0; i < hijos.getLength(); i++) {
        // Obtenemos el hijo i
        Node hijo = hijos.item(i);

        // Si es un nodo
        if (hijo.getNodeType() == Node.ELEMENT_NODE) {

            // Recorremos el hijo recursivamente
            loopNodeXml(hijo);

            // Atributos 
            if (hijo.getAttributes() != null && hijo.getAttributes().getLength() > 0) {
                NamedNodeMap atributos = hijo.getAttributes();
                for (int j = 0; j < atributos.getLength(); j++) {
                    Node attr = atributos.item(j);
                    // Recorremos el atributo recursivamente
                    loopNodeXml(attr);
                }
            }

            // si el nodo es un texto y no esta vacio
        } else if (hijo.getNodeType() == Node.TEXT_NODE && !hijo.getTextContent().trim().isEmpty()) {
            // Mostramos el contenido
            System.out.println("Valor: " + hijo.getTextContent());
        }

    }

}

Os dejo el ejemplo completo:


import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class RecorrerXML {

    public static void main(String[] args) {

        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document documento = builder.parse(new File("concesionario.xml"));

            loopNodeXml(documento.getDocumentElement());

        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Ejercicio_recursividad_DDR_36.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SAXException ex) {
            Logger.getLogger(Ejercicio_recursividad_DDR_36.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Ejercicio_recursividad_DDR_36.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void loopNodeXml(Node n) {

        // Mostramos el nombre del nodo
        System.out.println(n.getNodeName());

        // Obtenemos sus hijos
        NodeList hijos = n.getChildNodes();
        for (int i = 0; i < hijos.getLength(); i++) {
            // Obtenemos el hijo i
            Node hijo = hijos.item(i);

            // Si es un nodo
            if (hijo.getNodeType() == Node.ELEMENT_NODE) {

                // Recorremos el hijo recursivamente
                loopNodeXml(hijo);

                // Atributos 
                if (hijo.getAttributes() != null && hijo.getAttributes().getLength() > 0) {
                    NamedNodeMap atributos = hijo.getAttributes();
                    for (int j = 0; j < atributos.getLength(); j++) {
                        Node attr = atributos.item(j);
                        // Recorremos el atributo recursivamente
                        loopNodeXml(attr);
                    }
                }

                // si el nodo es un texto y no esta vacio
            } else if (hijo.getNodeType() == Node.TEXT_NODE && !hijo.getTextContent().trim().isEmpty()) {
                // Mostramos el contenido
                System.out.println("Valor: " + hijo.getTextContent());
            }

        }

    }

}


Este es el resultado:

concesionario
coches
coche
marca
Valor: AUDI
precio
Valor: 30000
matricula
Valor: 1111AAA
coche
marca
Valor: SEAT
precio
Valor: 10000
matricula
Valor: 2222BBB
coche
marca
Valor: BMW
precio
Valor: 20000
matricula
Valor: 3333CCC
coche
marca
Valor: TOYOTA
precio
Valor: 10000
matricula
Valor: 4444DDD

Os dejo un video donde podéis verlo con más detalle:

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

Compartir

Deja una respuesta

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