¿XML ... eso con que se come?

Java aparte de bonito, barato y eficiente es un lenguaje que permite procesar (con ayuda de algunas herramientas como:JAXB , XStream, JDom, etc.) los archivos *.xml.

Los documentos xml tienen varios usos:

  1. Intercambo de informaciön entre aplicaciones (Web o de escritorio)
  2. XML como "base de datos"
  3. Ahorro de recursos de los servidores
  4. etc.

Permite crear etiquetas personalizadas, sin embargo, es necesario que los documentos xml tengan un significado coherente.

Un ejemplo. Crear un xml que represente la entidad Programador y sus atributos (nombre,edad y email).

Programador.xml

<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?>
<Programador>
<Nombre>Daniel</Nombre>
<Edad>27</Edad>
<Email>daniel.2132@servidor.com</Email>
</Programador>

Es un archivo xml básico, pero todavia falta como darle validez.

¿Cómo se le da validez a los archivos xml?

Existen dos alternativas (validadores) los Documentos de definición de tipos:

1. DTD : ,describe la estructura del documento con un lenguaje que no tiene nada que ver con XML.
2. XML Schemas: describe la estructura con XML

Ejemplo con DTD.

programador.dtd

<!ELEMENT Programador(Nombre,Edad,Email)>
<!ELEMENT Nombre (#PCDATA)>
<!ELEMENT Edad (#PCDATA)>
<!ELEMENT Email (#PCDATA)>

Existen reglas para definir los elementos ( ), la cardinalidad (?,*,+), pero solo quiero poner una muestra sencilla.

Asi quedaria el documento xml con dtd.

<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?>
<!DOCTYPE Programador SYSTEM "programador.dtd">
<Programador>
<Nombre>Daniel</Nombre>
<Edad>27</Edad>
<Email>daniel.2132@servidor.com</Email>
</Programador>

Tratamiento de documentos XML

Básicamente existen dos alternativas (se denominan parsers o analizadores):

1. SAX:Simple API for XML, consiste en procesar los documentos xml según se va leyendo las etiquetas y se van localzando los elementos

2. DOM:Document Object Model, consiste en leer el documento xml y obtener y modelo basado en objetos que se mantienene en memoria para poder realizar el tratamiento conforme sea necesario sobe la información leida. Es más lento que SAX.

He aqui un ejemplo de un programa que lee XML escrito por @javadabadoo
http://www.javamexico.org/blogs/javadabadoo/leer_xml

editado:
Espero continuar con el tema y hacer un ejemplo con JAXB. En otro post trataréde hablar más de esa tecnología con ayuda de NetBeans y/o Eclipse.


Crear una clase java básica.
Datos1.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.pruebas;
//import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
 *
 * @author yo
 */

@XmlRootElement
public class Datos1 {
   
    private double valor,tasa;
    private int periodo;

    /**
     * @return the valor
     */

    public double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */

    @XmlElement
    public void setValor(double valor) {
        this.valor = valor;
    }

    /**
     * @return the tasa
     */

    public double getTasa() {
        return tasa;
    }

    /**
     * @param tasa the tasa to set
     */

    @XmlElement
    public void setTasa(double tasa) {
        this.tasa = tasa;
    }

    /**
     * @return the periodo
     */

    public int getPeriodo() {
        return periodo;
    }

    /**
     * @param periodo the periodo to set
     */

    @XmlElement
    public void setPeriodo(int periodo) {
        this.periodo = periodo;
    }
   
   
}

Convertir esa clase a xml.

ControlDatos1Xml.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package control.pruebas;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import modelo.pruebas.Datos1;

import javax.swing.JOptionPane;

/**
 *
 * @author yo
 */

public class ControlDatos1Xml {
   
    Datos1 datos= new Datos1();
    public static void main(String[] args){
         ControlDatos1Xml control= new ControlDatos1Xml();
         
         double v=0,t=0; int p;
         v=Double.parseDouble(JOptionPane.showInputDialog("valor"));
         t=Double.parseDouble(JOptionPane.showInputDialog("tasa"));
         p=Integer.parseInt(JOptionPane.showInputDialog("periodo"));
         
         
         control.datos.setPeriodo(p);
         control.datos.setTasa(t);
         control.datos.setValor(v);
         
         //------------------------------------
         try {
 
                File file = new File("/home/user/PruebasClases/dat1.xml");
                JAXBContext jaxbContext = JAXBContext.newInstance(Datos1.class);
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
 
               
                jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 
                jaxbMarshaller.marshal(control.datos, file);
                jaxbMarshaller.marshal(control.datos, System.out);
 
              } catch (JAXBException e) {
                e.printStackTrace();
              }
         
         JOptionPane.showMessageDialog(null, "XML generado");

       
        //-----------------------------------
   
         
         
     
    }
   
   
   
}

Leer el XML como si fuera objeto.

ControlDatos1Class.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package control.pruebas;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import modelo.pruebas.Datos1;

/**
 *
 * @author yo
 */

public class ControlDatos1Class {
    public static void main(String[] args){
       
        try {
 
                File file = new File("/home/user/PruebasClases/dat1.xml");
                JAXBContext jaxbContext = JAXBContext.newInstance(Datos1.class);
 
                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                Datos1 datos = (Datos1) jaxbUnmarshaller.unmarshal(file);
                System.out.println(datos);
               
               
                //---------------------------------------
                if(datos.getValor()<=0){
                  System.out.println("El valor no debe ser menor o igual a cero");
                }
               
                //------------------------------------
               
                else{
                System.out.println("valor -->"+datos.getValor());
               
               
                System.out.println("tasa -->"+datos.getTasa());
                System.out.println("periodo -->"+datos.getPeriodo());
                }
 
          } catch (JAXBException e) {
                e.printStackTrace();
          }

       
        //-----------------------------------
       
   
    }
   
}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Buen repaso, aunque

Pues como progrmador java no saber xml es algo difícil (muchas cosas se siguen configurando por medio de xml, a la fecha un ejemplo es el persistence.xml para configurar jpa).

Ahora, fuera de lo obligatorio (por cuestión técnica o petición de un cliente) no veo caso de usar xml, para ello me decantaría por yaml usando jyaml o aún mejor usaría json en lugar de yaml y xml.

Claro, que no siempre se puede hacer nuestra falsa voluntad.

Me mandaron a spam ¬_¬

Bueno, repito el comentario porqué de nuevo, el anti-spam de JavaMexico hizo de las suyas.

Es un buen repaso, esto del XML es una de las bases para hacer muchas cosas en Java (desde los tiempos de Ant, hasta ahora con el persistence.xml); también venimos usándolos desde los webservices que a fin de cuentas lo que regresan es un mensaje (¿se puede decir serializado?) en algún tipo de dato y XML era usado cómo un tipo de dato.

Poco después del XML aparecen variantes y contravariantes. En su caso me gustan más las contravariantes, en caso de que no tuviera cómo requerimiento/obligación usar XML. Y estos son: YAML y JSON/BSON.

De momento, me alejo de XML salvo del pom de Maven (sí, sigo en Maven porqué no me convence Gradle con todas sus bondades) y el persistence de JPA; en su lugar para webservices uso json, es bastante menos complejo (de escribir y leer) y también es más ligero. Claro que cuando toca poner configuraciones estáticas uso YAML.

Los lenguajes de marcas son chidos, pero, es precisamente esa su desventaja (las marcas)...Es más sencillo dar: {"nombre": "Pepito", "apellido": "Chavez", "edad": 13} en lugar de:

<?xml version="1.0" enconding="UTF-8" ?>
<Persona nombre="Pepito" apellido="Chavez" edad="13" />

Otra es que cuando tienes un atributo con varios elementos, en xml es bastante más largo:

<?xml version="1.0" enconding="UTF-8" ?>
<Persona>
---<nombre>Pepito</nombre>
---<apellido>Chavez</apellido>
---<edad>13</edad>
---<libros>
------<libro>
---------<autores>
------------<autor nombre="Friedrich" apellido="Nietzsche">
---------</autores>
---------<titulo>El anticristo</titulo>
------</libro>
---</libros>
</Persona>

Con JSON otra cosa nos cantaba:

{
---"nombre": "Pepito",
---"apellido": "Lopez",
---"edad":  13,
---"libros": [
------{
---------"autores": [
-----------{"nombre": "Friedrich", "apellido": "Nietzsche"}
---------],
---------"titulo": "El anticristo"
------}
---]
}

Quizás con los espacios no se nota mucho, pero recordemos que JSON es algo "más lineal" que XML.

En fin, creo que ha quedado claro el ejemplo. No se menosprecia XML ni su uso, pero, en varios casos es mejor utilizar otras alternativas (en el caso de los webservices por ejemplo); hasta me estoy pensando hacer una entrada de manejo de JSON con GSON, falta de tener tiempo.

Imagen de Sr. Negativo

XMLitis

Si XML puede causar un poco de "miedo" cuando trabajas en proyectos muy grandes. O cuando nunca los habias usado (ni sabias su uso) y te dicen: "son necesarios para las consultas de la base de datos, si no están no podrás hacer uso de ella (de la base) "

Perp bien, existen herramientas/APIS como JAXB que facilitan el tratamiento de estos documentos y nos evitan grandes dolores de cabeza.

@wishmaster77
No he usado JSON. Se ve interesante.

Re: XMLitis

Exacto, no hay que exagerar; XML tiene su lugar, pero es que hace unos ayeres había gente que quería usar XML hasta para definir los queries ¬_¬ (razón del "rencor" que le guardo a XML).

Pues en esta semana si tengo tiempo (o quizás mañana por la mañana) hago una entrada sencilla de manejo de yaml y de json en comparación con XML (de hecho, también tengo una entrada, que pudiese ser complemento a esta; es hacer básicamente lo que hacer curl y procesar un xml para los feeds de RSS que wordpress avienta).

Sin duda, hay muchas herramientas que nos ayudan cómo JAXB, yo utilizaba XStream , pero pues a también muchas veces me voy a lo "raw" y los uso directamente.

Por cierto los dtd van de

Por cierto los dtd van de salida y lo mejor es usar XSD's. No conozco la razón detrás de esto y digamos que tampoco me ha entusiasmado mucho el tema.

Yo también prefieron JSON ( JavaScript Object Notation ) sobre XML cuando fuera posible, pero no siempre es posible. Básicamente la razón es que es un formato muy legible y muchas veces esto facilita las pruebas.

Imagen de Sr. Negativo

DTDs

Queria hacer un ejemplo tanto de DTD como XSD pero mejor lo trato en el próximo post (espero) con JAXB.

No he usado JSON ni XStream. Habrá que investigar.

Imagen de Algus Dark

Antes de que programara en

Antes de que programara en JAVA, no utilicé los xml's, comencé a hacer uso de JSON cuando programaba en PHP para la comunicación AJAX. Un tema muy interesante Sr. Negativo. No he tenido mucho tiempo de investigar mucho de DTD,XSD. Sé lo muy básico de xml y comencé con JDOM para ello.

Esperando el siguiente post. Gracias por la info.

Imagen de ezamudio

xmlitis

El mundo Java (sobre todo JEE) en algún momento estuvo plagado de XML, al grado que al día de hoy todavía hay secuelas de ese problema; incluso para muchos que lo vieron desde fuera, ya nada más escuchan "Java" y piensan en XML... por ahí circulaba una frase de que Java era un DSL para convertir XML en stack traces (que pocos leen además).

Ya recientemente se le está quitando la XMLitis a Java; en algunos casos se convirtió en anotacionitis, en otros casos (menos) se ha mejorado el diseño de las cosas para facilitar realmente la configuración y no dejar todo tan abstracto (aunque por la bronca de ser "enterprisey" pues parece que es a fuerzas que haya abstracciones innecesarias y configuracionitis al pormayor). Esfuerzos como Thrift, Protobuf, bibliotecas para manejar JSON, etc ayudan aminorar la cantidad de XML, pero pues de épocas pasadas ya hay mucho XML legacy en varios desarrollos empresariales y desafortunadamente no será fácil deshacerse de él. Y cosas como los web services, que insisto, para mí son el equivalente de las Betamax en el desarrollo de software, no están ayudando porque pues el lenguaje de los web services es XML. En REST tenemos la opción de usar JSON o incluso el url-encoding; formatos más sencillos (y sobre todo eficientes) de codificar y parsear.

PS Digo que los web services son como las Betamax por esto: En los 80's cuando se popularizaron las VCR (videocaseteras, videograbadoras, como les quieran llamar), en USA hubo una guerra de formatos entre Sony y todos los demás fabricantes (principalmente JVC), similar a la que hubo este siglo con lo del Blu-ray; solamente que en los 80's, Sony perdió la guerra y el formato que prevaleció fue VHS. Así que de repente había miles y miles de videocaseteras Betamax que nadie quería en USA... la solución para deshacerse de ellas? Traerlas a México y venderlas aquí (y supongo que en el resto de latinoamérica también, no sé). Aquí ni nos habíamos enterado de la guerra de formatos, solamente nos invadieron con el producto perdedor. Por eso en México cuando se popularizaron las videocaseteras, prácticamente todo mundo tenía betamax. Fue hasta años después cuando ya empezaron a fallar y no había refacciones porque era una tecnología descontinuada, muerta, que la gente comenzó a comprar VHS, los videocentros empezaron a cambiar su catálogo a formato VHS, y ya para los 90's fue lo que todo mundo tenía.

Así siento que ahora es con los web services. A principios de siglo era la moda en USA, pero quienes lo adoptaron más fuerte fueron las grandes empresas, megacorporaciones, que son leeeeentas para sus desarrollos que no son core business, y pues hasta la fecha siguen usándose en varias partes, mientras que las empresas más vanguardistas se saltaron por completo esa tecnología o la adoptaron e inmediatamente vieron que era una mugre y comenzaron a desarrollar y/o impulsar lo que seguía y/o alternativas mejores: REST, JSON, formatos binarios, etc. Pero aquí, cada vez veo más y más empresas usando web services, cuando en USA cada vez es menos. Entiendo perfectamente lo que pasó en los 80's, pero hoy tenemos internet, se supone que nos enteramos de las tendencias tecnológicas al mismo tiempo en todo el mundo; por qué crece en México la adopción de tecnologías que ya no se siguen usando en USA para nuevos desarrollos?

Imagen de CesarAlducin

Muy interesante tu comentario

Muy interesante tu comentario @ezamudio, como siempre en México usando lo que en otros países ya paso de moda, tengo una pregunta dices que los Web Service ya van de salida entonces que me recomiendas estudiar y que tan factible es que encuentre una empresa donde estén cambiando los Web Service por REST, JSON etc....

O seria mejor yo proponer el cambio (eso se escucho muy guerrero)

Saludos

Imagen de ezamudio

proponer

Va a estar difícil que en México encuentres una empresa que esté dejando los web services para implementar otra cosa. Es mucho más fácil que encuentres empresas que están implementando web services.

Imagen de bferro

¿Qué los Web services están de salida?

O no entendí muy bien los comentarios, o ya no carburo bien. Que alguien me explique eso de que los Web Services están de salida. ¿Qué es entonces REST y otras cosas?
Una cosa es decir que las implementaciones que se usaron inicialmente ya están de salida y otra decir que los web services ya están a punto de perecer.

Imagen de ezamudio

ok las impls

OK Ok, yo concretamente me refiero a cosas como SOAP-RPC con su xmlitis terminal. Pero en la práctica eso es lo que todo mundo quiere decir cuando dice "web service" (particularmente los que ni siquiera lo saben conjugar y siempre dicen "web services" en plural, "tenemos un web services").

Y yo no digo que están a punto de desaparecer, todo lo contrario; nos estamos plagando de web services (implementados con SOAP-RPC) que se usan por la falsa percepción de que es lo más fácil de publicar; cuando en realidad hay mejores interfaces para ciertos casos de uso, pero pues con "el web services" nomás le dan click al wizard next,next,next y listo! ya está el esqueleto, nomás le rellenan el código y si luego hay broncas de concurrencia, nomás le ponen synchronized a todo y listo.

Imagen de bferro

Deprecating XML

Norman Walsh escribió en su blog hace un año algo relacionado con lo que aquí se discute. http://norman.walsh.name/2010/11/17/deprecatingXML

Fuentes de web services

Alguno de ustedes conoce un buena fuente de literatura de creacion, consumo, mejores practicas de web services, porque lo que encuentro en la red casi siempre es lo mismo y para mi entendimiento no esta bien documentado.

La neta como dice ezamudio yo soy de los que crea un cliente con ayuda de un asistente porque es la unica forma en que sé hacerlo

Y no sé si él recuerda pero van creo 2 o 3veces que escribe lo mismo o parecido

nomás le rellenan el código y si luego hay broncas de concurrencia, nomás le ponen
 synchronized a todo y listo.

Creo eso fue una vez por mi creo, postee un tema de web service y concurrencia. Ademas no le quise poner syncronyzed a todo solo a un método :-P jajaj

Ya en serio si pudieran hacer un post explicando como crear y/o consumir un web service con las mejores practicas neta que muchos se lo agradeceriamos.

Imagen de ezamudio

yo hice uno

En mi blog yo puse uno de todo lo que NO hay que hacer, te puede servir.

Informacion de Webservices

también me he topado que en la web no encuentro mucha información especifica sobre clientes, consumo de web services para trabajar con java y si alguien conoce algun documento, libro, etc se lo agradecere..de antemano gracias