Parsear XML en un String en Java

Ok esta entrada la escribo porque hasta hace 3 horas atrás no tenía ni idea de cómo hacerlo😯

Estoy haciendo un sistema de planificación para una amasandería, y uno de los módulos es un recetario.

Entonces tengo un formulario en el cual ingreso los datos, luego los formateo en XML, los envío al servidor y luego los parseo para hacer con ellos lo que quiera.

El XML es así:

<Info_Receta>
  <Datos_Receta nombre="Torta Chocolate" tipo="1" tiempo="2:00" />
  <Preparacion_Receta>
    Se mezcla tal cosa, luego se junta con esta otra. Se hornea y listo
  </Preparacion_Receta>
  <Ingredientes_Receta>
    <Ingrediente cantidad="130" Umedida="Gramos" producto="Harina" />
    <Ingrediente cantidad="16" Umedida="Gramos" producto="Mantequilla" />
    <Ingrediente cantidad="240" Umedida="Gramos" producto="Chocolate en Polvo" />
  </Ingredientes_Receta>
</Info_Receta>*/

Es solo un ejemplo… obviamente los ingredientes no cuadran xD

Recibo esto en el servidor, y lo guardo tal cual en un String (que curiosamente llamo xml…)

Ahora, lo envío a una clase especial para que me parsee lo que quiero. La llamaré XML😯

La clase es como sigue (no me molesten porque la hice a la rápida😛 ):

import javax.xml.parsers.*;
import org.xml.sax.InputSource;
import org.w3c.dom.*;
import java.io.*;
import java.util.ArrayList;

/**
 *
 * @author Mario Cares
 */
public class XML {

    public ArrayList<String> parsearXML(String xml){
        ArrayList<String> datos = new ArrayList<String>();
        try{
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            Document doc = dBuilder.parse(is);
            doc.getDocumentElement().normalize();
            // respuesta1 = doc.getDocumentElement().getNodeName()+" - "; Con esto se obtiene la raíz primaria.
             // en este caso, devuelve Info_Receta
            //<Datos_Receta nombre="Torta Chocolate" tipo="1" tiempo="2:00" />
            datos.add(doc.getElementsByTagName("Datos_Receta").item(0).getAttributes().getNamedItem("nombre").getNodeValue());
            datos.add(doc.getElementsByTagName("Datos_Receta").item(0).getAttributes().getNamedItem("tipo").getNodeValue());
            datos.add(doc.getElementsByTagName("Datos_Receta").item(0).getAttributes().getNamedItem("tiempo").getNodeValue());
            //<Preparacion_Receta>Se mezcla tal cosa, luego se junta con esta otra. Se hornea y listo</Preparacion_Receta>
            datos.add(doc.getElementsByTagName("Preparacion_Receta").item(0).getChildNodes().item(0).getNodeValue());
            //<Ingredientes_Receta>
            //  <Ingrediente cantidad="130" Umedida="Gramos" producto="Harina" /> y siguientes. Siguen la misma
             // estructura, solo cambia el item(i) por el siguiente y así tantas veces como ingredientes tenga.
            for (int i = 0; i < doc.getElementsByTagName("Ingrediente").getLength(); i++) {
                datos.add(doc.getElementsByTagName("Ingrediente").item(i).getAttributes().getNamedItem("cantidad").getNodeValue());
                datos.add(doc.getElementsByTagName("Ingrediente").item(i).getAttributes().getNamedItem("Umedida").getNodeValue());
                datos.add(doc.getElementsByTagName("Ingrediente").item(i).getAttributes().getNamedItem("producto").getNodeValue());
            }
        }catch (Exception e){
            datos.add(e.toString()); //En caso de algún error
        }
        return datos;
    }
}

Y eso🙂 Como pueden darse cuenta, cada dato lo envío a un ArrayList, donde es más simple usar los datos para agregarlo a la BD.

Esta clase la llamo desde un Servlet de esta forma:

out.write(xml.parsearXML(request.getParameter("datosReceta")).toString());

datosReceta es la variable que envío desde el formulario

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Java, Lenguajes, Proyecto, Tutoriales. Guarda el enlace permanente.

4 respuestas a Parsear XML en un String en Java

  1. José dijo:

    tirate el codigo completo!

  2. Manuel Miranda dijo:

    Hey Gracias, me sirvio, pase varias horas buscando como leer un String que tenia datos xml, y no habia encontrado algo tan claro como lo que hoy has compartido, Gracias nuevamente.

  3. Jose dijo:

    hola consulta
    tengo un string que contiene mi xml, el tema es que necesito ingresarle datos ya que me xml solo tiene la estructura y a medida que lo necesite se vede llenar con datos ley por ahi que devo usar algo llamado “xpath” esto lo estoy haciendo e java

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s