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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
xml version="1.0" encoding="UTF-8" standalone="no"?> |
De primeras tenemos que usarla clase DocumentBuilderFactory y DocumentBuilder:
|
1 2 3 4 |
// 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:
|
1 2 |
// 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:
|
1 2 |
// Cojo todas las etiquetas coche del documento NodeList listaCoches = documento.getElementsByTagName("coche"); |
Ya teniendo el NodeList, iremos recorriendo y cogiendo cada uno de ellos:
|
1 2 3 4 5 6 |
// 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// 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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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