Leer archivo XML desde Java

Una manera simple de leer un archivo XML en Java

Hoy en día los xml se han convertido en uno de los princiapales arvhivos que almecenan estructuras de datos sin importar cual sea ambiente, sistema operativo, o lenguaje de programación.

Este ejemplo va a ilustrar como obtener los datos desde un xml de una manera muy básica

Pimero, veamos la estructura del archivo xml llamado libro.xml que está guardado en algun lugar de nuestra pc:


<libro>

<persona>

<nombre>Kiran</nombret>

<apellido>Pai</apellido>

<edad>22</edad>

</persona>

<persona>

<nombre>Juliet</nombret>

<apellido>Mai</apellido>

<edad>19</edad>

</persona>

<persona>

<nombre>Gio</nombret>

<apellido>Bill</apellido>

<edad>23</edad>

</persona>

</libro>

Según la estructura del archivo anterior, el nodo mayor o raíz llamado libro contiene tres elementos que persona que a su vez son nodos que contienen otrso elementos, cada persona tiene como atributos el nombre, el apellido y la edad. Es una estructura bastante entendible.

Por lo general, para todos los ejemplo siempre acostumbro primero explicar el código, luego la salida que proyecta dicho código. En este caso vamos a ver la salida de la aplacación acontinuación, para luego pasar al código.

El elemento raíz es: libro

Número total de personas : 3

Nombre : Kiran

Apellido : Pai

Edad : 22

Nombre : Juliet

Apellido : Pai

Edad : 19

Nombre : Gio

Apellido : Bill

Edad : 23

Ahora, en java vamos a empezar a leer cada unos de los elementos que conforman cada parte del archivo. El primer paso es tomar el archivo físico y por medio de un InputStream convertilo en un objeto totalmente manipulable desde java.


DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

Document doc = docBuilder.parse (new File("libro.xml"));

Para asegurarnos de que la conversión haya sido la correcta, imprimimos el nombre de la raíz co el método getNodeName(). Hay que aclarar, que la lectura de un archivo xml siempre va de arriba hacia abajo, por lo tanto, el primer nodo que encontrará será <libro>  (libro).


doc.getDocumentElement ().normalize ();

System.out.println ("El elemento raíz es " +

doc.getDocumentElement().getNodeName());

Ahora que nos encontramos dentro al nivel que el nodo libro vamos a iterar entre sus elementos personas, y en cada iteración vamos a imprimir los datos de cada persona.

Buscamos dentro del objeto doc (el xml como objeto) la etiqueta o elemento <persona> (persona) con el método getElementsByTagName(“nombre-etiqueta-a-buscar”) del objeto doc.


NodeList listaPersonas = doc.getElementsByTagName("persona");

int totalPersonas = listaPersonas.getLength();

System.out.println("Número total de personas : " + totalPersonas);

La variable listaPersonas es una pequeña estructura de datos que contiene la información de las personas.  Asímismo, podemos recorrerlo como si fuera un ArrayList o una List de objetos que tienen perdonas.  Lo indicado es recorrer dicho vector con un ciclo, de la siguiente manera:


for (int i = 0; i < totalPersonas.getLength() ; i ++) {

Node persona = listaPersonas.item(s);

}

Hasta acá hemos topado con la parte fácil, puer ahora lo que queda es tomar el objeto persona y extraer sus atributos. Aquí quiero hacer notar la diferencia que un Node (nodo) es un elemento que a su vez tiene elementos dentro de sus etiquetas, como lo que pasa con los nodos personas, y que, los elementos (Element) son todos aquellas atributos que unicamente tienen valores dentro de sus etiquetas, lo que pasa con nombre, apellido y edad, algo así como las hojas en un árbol binario.

Ahora, solo falta extraer los valores de cada persona, son embargo, a pesar de que visualmente sabemos de que cada persona tiene sus propios atrubutos con sus respectivos valores, debemos validar esa condición… asegurar que la persona tenga atributos. Y para que una persona realmente tenga atributos quiere decir que por definicón es un Node (nodo). Eso se resuelve con getNodeType():

if (persona.getNodeType() == Node.ELEMENT_NODE) 

Y para finalizar se imprime cada  uno de los elementos de la persona, con ayuda del método getTagValue(“nombre -de-la-etiqueta”) que funciona para identificar cada atributo de la persona:


Element elemento = (Element) persona;

System.out.println("Nombre : "  + getTagValue("nombre",elemento ));

System.out.println("Apellido : "  + getTagValue("apellido",elemento ));

System.out.println("Edad : "  + getTagValue("edad",elemento ));

El método no es propiamente del API de java, le he programado para faciliar el trabajo a la hora de extraer los valores de cada etiqueta.


public String getTagValue(String tag, Element elemento) {

NodeList lista = elemento.getElementsByTagName(tag).item(0).getChildNodes();

Node valor = (Node) lista.item(0);

return valor.getNodeValue();

}

Acá dejo los archivos necesarios:

LecturaXML.java y libro.xml

29 comments

  1. Esto no vale para nada

  2. Gracias! Me fue de mucha ayuda el dia de hoy, excelente publicaci[on!

  3. Me alegro que te haya servido :)

  4. Genial!! esto es lo que estaba buscando. Gracias!

  5. Excelente, sencillo y conciso, me dio muchas ideas.

  6. Gracias mi hermano m pase buskndo algo similar pero naaa;
    una preguntota mmmm aki en el ejemplo korres el programa sabiendo komo se llaman los nodos pero sip no supiramos komo se llamarán los nodos, komo le hariamos sakariamos algo así komo node.next(es sólo por decir) para q nos avient el nombre del siguiente nodo i los vamos akomulando en un vector para q dspues utilizemos esos String como String tag oooooo estoy muy perdido
    jojojo Gracias por el aporte me saco de muchas dudas thanks i pues si no es mucha molestía kontstar mi duda pues de ant mano Thanks jojo

  7. Muchas Gracias.
    La 1º vez q estuve buscando algo q me dijera y enseñara como parsear un XML con Java, esta fue una de las primeras Paginas q vi, pero no me ayudo, poco tiempo despues ya con mas conocimiento de causa y bastante familiarizado con los terminos y metodos esta pagina me ayudo a resolver mis ultimas dudas.
    !!Felicidades q buena Publicacion.!!

  8. Gracias, me has salvado de una. Me sirvió a la perfección.

  9. Muchas gracias, muy util esta informacipon

  10. Perfecto para empezar. A partir de aquí se puede complicar cuanto haga falta. Muchas gracias

  11. Laura Marianella Zapata Aspiazu

    Muchisimas gracias amigo, me ha ayudado bastante.
    Gracias mil.
    Att:
    Laura Marianella Zapata Aspiazu.
    Babahoyo-Ecuador.

  12. Muy buen post me ha servido mucho. gracias

  13. Buen aporte, simple y util. Saludos

  14. Muy buena explicación, me sirvió de mucho, muchas gracias :D

  15. Buen aporte, pero no me ha funcionado.
    Te explico, copie el codigo para reproducir el ejemplo y me esta botando un error en la linea

    >> doc = docBuilder.parse (new File(“build.xml”));

    Exception in thread “main” java.net.SocketException: Network is unreachable
    at java.net.PlainSocketImpl.socketConnect(Native Method)

    Me pudiera indicar que librerias debo importar, gracias.

    Por favor si me pudieras ayudar con eso, estaria muy agradecido.

  16. Muchas gracias Manix. Muy útil

  17. Tnx me ahorraste trabajo! :P

  18. Sanukode

    Esta bien el ejemplo, pero que pasa si tienes personas anidadas al persona?? se puede hacer algo con eso? que sea simple xD

  19. Vaibanez

    Gracias Amigo, es de maestros compartir el conocimiento Saludos.

  20. Muy bueno!! Muchisimas Gracias mi hermano!! Me sirvio demasiado!!!!!!!!!!
    Gracias!!!!!

  21. Grandioso, muchas gracias, esta genial.

  22. Como hago para capturar el nombre de los nodos hijos de persona. Ejemplo:

    Entonces quiero saber que funcion se debe hacer para que me retorne:
    -nombre
    -apellido
    -edad

    Es decir, los nombres de los nodos hijos de persona.

  23. gracias vos, muy bueno tu ejemplo ;)

  24. EL DEL PRIMER COMENTARIO DE ESTE SITIO QUE CHINGUE A TODA SU REPUTISIMA Y BOMBA MADRE! NO SABE LO QUE DICE MALDITO INCULTO HAS DE SER SUDAMERICANO Y NEGRO!..i..

    • Agradeceria que no utilices la palabra SUDAMERICANO y NEGRO para tratar de ofender,, asi que por favor mide tus palabras, este es un espacio para la tecgonolia

  25. correccion del archivo xml:

    Kiran
    Pai
    22

    Juliet
    Mai
    19

    Gio
    Bill
    23

  26. Correccion del archivo xml de ejemplo:

    Kiran
    Pai
    22

    Juliet
    Mai
    19

    Gio
    Bill
    23

  27. juan carlos

    buen codigo funciona muy bien!!!

Leave a Reply