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:
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 < 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 < 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 < 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 < 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) { } } 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.
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