2011-04-29 34 views
8

¿Cómo puedo convertir un archivo xml en un simple Java Bean? Es un archivo xml simple sin ninguna xsd, que se generó a partir de un bean Java, al que no tengo acceso.Convertir xml a Java Bean

Intenté usar xmlbeans para generar primero el xmd a partir de xml y luego generar clases a partir del xsd. Tengo un montón de clases. Estoy buscando una sola clase de Java Bean.

Respuesta

-1

Puede usar una herramienta como Castor o JAXB para asignar el XML a una clase java. Castor es bastante fácil de usar.

12

JAXB

JAXB (JSR-222) proporciona una manera fácil de convertir objetos a XML. Hay muchas implementaciones de código abierto de este estándar, incluyendo:

JAXB tiene una asignación predeterminada para objetos Java a XML. Este mapeo se puede personalizar mediante la aplicación de anotaciones.

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.Element; 

@XmlRootElement 
public class Address { 

    private String street; 

    private String city; 

    private String state; 

    private String country; 

    @XmlElement(name="postal-code") 
    private String postalCode; 

} 

correspondería a la siguiente XML:

<address> 
    <street>123 A Street</street> 
    <city>Any Town</city> 
    <state>A State</state> 
    <postal-code>12345</postal-code> 
</address> 

EclipseLink JAXB (MOXY)

MOXY tiene una extensión de mapeado basado XPath. Esto significa que podemos tomar nuestra misma clase de direcciones y asignarla al formato de codificación geográfica de Google:

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="kml") 
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"}) 
public class Address { 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") 
    private String street; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()") 
    private String city; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") 
    private String state; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") 
    private String country; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") 
    private String postalCode; 

} 

La clase anterior corresponde a la siguiente XML:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.0" xmlns:ns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"> 
    <Response> 
     <Placemark> 
      <ns:AddressDetails> 
       <ns:Country> 
        <ns:CountryNameCode>US</ns:CountryNameCode> 
        <ns:AdministrativeArea> 
         <ns:AdministrativeAreaName>CA</ns:AdministrativeAreaName> 
         <ns:SubAdministrativeArea> 
          <ns:Locality> 
           <ns:LocalityName>Mountain View</ns:LocalityName> 
           <ns:Thoroughfare> 
            <ns:ThoroughfareName>1600 Amphitheatre Pkwy</ns:ThoroughfareName> 
           </ns:Thoroughfare> 
           <ns:PostalCode> 
            <ns:PostalCodeNumber>94043</ns:PostalCodeNumber> 
           </ns:PostalCode> 
          </ns:Locality> 
         </ns:SubAdministrativeArea> 
        </ns:AdministrativeArea> 
       </ns:Country> 
      </ns:AddressDetails> 
     </Placemark> 
    </Response> 
</kml> 

Para obtener más información