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.
Deja una respuesta