martes, 29 de julio de 2014

JAXB, Java Architecture for XML Binding, como asignar clases de JAVA a representaciones XML.

JAXB Java Architecture for XML Binding

JAXB, es el acrónimo de Java Architecture for XML Binding, se utilizan notaciones JAXB para convertir objetos Java a un XML String y viceversa. En este tutorial, se mostrará cómo utilizar JAXB haciendo uso de lo siguiente:

  1. Marshalling – Convertir objetos Java a XML String
  2. Unmarshalling – Convertir un XML String a un Objeto de Java

Tecnologías utilizadas:

  • JDK 1.6
  • JAXB 2.0

1.- Dependencias

No se requieren librerías extras de jaxb si estas utilizando JDK1.6 o superior, ya que estas librerías de JAXB vienen incluídas en el JDK 1.6

2.- Notaciones JAXB

Para un objeto que necesita ser convertido a un XML String, se tiene que utilizar notaciones JAXB.

 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
package com.tutorial.pruebas;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "root")
@XmlAccessorType (XmlAccessType.FIELD)
public class Root {

 private String adress;
 
 public String getAdress() {
  return adress;
 }

 public void setAdress(String adress) {
  this.adress = adress;
 }

 @XmlElement(name = "data")
 private Data data;
 
 @XmlElement(name="parametros")
 private Parametros parametros;
 
 public Data getData() {
  return data;
 }
 
 public void setData(Data data) {
  this.data = data;
 }
 
 public Parametros getParametros() {
  return parametros;
 }
 
 public void setParametros(Parametros parametros) {
  this.parametros = parametros;
 }
 
 
}
 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
package com.tutorial.pruebas;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name = "data")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data {

    @XmlAttribute(name = "id")
    private int id;

    @XmlAttribute(name = "oficina")
    private String oficina;
    
    
    @XmlValue
    private String data;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getData() {
  return data;
 }

 public void setData(String data) {
  this.data = data;
 }

 public String getOficina() {
  return oficina;
 }

 public void setOficina(String oficina) {
  this.oficina = oficina;
 }
 
 
}
 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
package com.tutorial.pruebas;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "parametro")
@XmlAccessorType (XmlAccessType.FIELD)
public class Parametros {

 private List<Parametro> parametro;

 public List<Parametro> getParametro() {
  return parametro;
 }

 public void 
 setParametro(List<Parametro> parametro) {
  this.parametro = parametro;
 }

 
 
 
    
}
 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
package com.tutorial.pruebas;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name = "parametro")
@XmlAccessorType (XmlAccessType.FIELD)

public class Parametro {
 
    @XmlAttribute(name = "nombre")
    private String nombre;
    
    @XmlValue
    private String valor;
    
 public String getNombre() {
  return nombre;
 }
 
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 
 public String getValor() {
  return valor;
 }
 
 public void setValor(String valor) {
  this.valor = valor;
 }
 

}

3.- Convertir objeto a XML

 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
63
64
package com.tutorial.pruebas;

import java.io.StringWriter;
import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Tutorial {

 public static void main(String[] args){
  
  Root root = new Root();
  
  root.setAdress("Street no 7");
   
  Data data = new Data();
   
  data.setId(1000);
  data.setData("valor1");
  data.setOficina("oficina no. 20");
   
  Parametros parametros = new Parametros();
  parametros.
  setParametro(new ArrayList<Parametro>());
  Parametro parametro = new Parametro();
  parametro.setNombre("Mario");
  parametro.setValor("SI");
  parametros.getParametro().add(parametro);
   
  parametro = new Parametro();
  parametro.setNombre("Hugo");
  parametro.setValor("NO");
  parametros.getParametro().add(parametro);
   
  parametro = new Parametro();
  parametro.setNombre("Luis");
  parametro.setValor("SI");
  parametros.getParametro().add(parametro);
   
  root.setData(data);
  root.setParametros(parametros);
  
  
  try{
  JAXBContext jaxbContext = JAXBContext.
    newInstance(Root.class);
  Marshaller jaxbMarshaller = jaxbContext.
    createMarshaller();
   
  java.io.StringWriter sw = new StringWriter();

  jaxbMarshaller.
  setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  jaxbMarshaller.marshal(root, sw);       
      
  System.out.println(sw.toString());
  }catch(Exception ex){
   ex.printStackTrace();
  }
  
 }
 
}
Salida:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <root>
    <adress>Street no 7</adress>
    <data id="1000" oficina="oficina no. 20">valor1</data>
    <parametros>
 <parametro nombre="Mario">SI</parametro>
 <parametro nombre="Hugo">NO</parametro>
 <parametro nombre="Luis">SI</parametro>
    </parametros>
   </root>

4.- Convertir XML a objeto

Entrada:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <root>
    <adress>Street no 7</adress>
    <data id="1000" oficina="oficina no. 20">valor1</data>
    <parametros>
 <parametro nombre="Mario">SI</parametro>
 <parametro nombre="Hugo">NO</parametro>
 <parametro nombre="Luis">SI</parametro>
    </parametros>
   </root>
 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
package com.tutorial.pruebas;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Tutorial {

 public static void main(String[] args){

  try{
   StringBuffer xmlStr 
   = new StringBuffer(
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+"<root>"
+"<adress>Street no 7</adress>"
+"<data id=\"1000\" oficina=\"oficina no. 20\">valor1</data>"
+"<parametros>"
+"<parametro nombre=\"Mario\">SI</parametro>"
+"<parametro nombre=\"Hugo\">NO</parametro>"
+"<parametro nombre=\"Luis\">SI</parametro>"
+"</parametros>"
+"</root>");
 JAXBContext jaxbContext = JAXBContext.
 newInstance(Root.class);
   
 Unmarshaller jaxbUnmarshaller = jaxbContext.
 createUnmarshaller();
   
 Root root = (Root) 
 jaxbUnmarshaller.
 unmarshal(  
   new StringReader( xmlStr.toString()  
     ));

 System.out.println(root.getAdress());
 System.out.println(root.getData().
   getData());
 System.out.println(root.getData().
   getId());
 System.out.println(root.getData().
   getOficina());
 System.out.println(root.getParametros().
   getParametro().get(0).getNombre());
 System.out.println(root.getParametros().
   getParametro().get(0).getValor());
  }catch(Exception ex){
   ex.printStackTrace();
  }  
  
 }
 
}
Salida:
1
2
3
4
5
6
Street no 7
valor1
1000
oficina no. 20
Mario
SI

No hay comentarios.:

Publicar un comentario