2011-05-17 8 views
13

¿Es posible convertir un javax.xml.bind.annotation.XmlType en la representación de cadena del XML?¿Cómo obtener la representación de Cadena de XmlType?

Ejemplo:

El siguiente Req clase es de una biblioteca de terceros por lo que no puede anular el método toString().

@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD) 
@javax.xml.bind.annotation.XmlType(name = "req", propOrder = {"myDetails", "customerDetails"}) 
public class Req { 
... 
} 

En mi solicitud Quiero simplemente obtener una representación de cadena del XML para que pueda conectarse a un archivo:

<Req> 
    <MyDetails> 
    ... 
    </MyDetails> 
    <CustomerDetails> 
    ... 
    </CustomerDetails> 
</Req> 

Cuando intento utilizar JAXB y Marshall para convertir a XML cuerda:

JAXBContext context = JAXBContext.newInstance(Req.class); 
Marshaller marshaller = context.createMarshaller(); 
StringWriter sw = new StringWriter(); 
marshaller.marshal(instanceOfReq, sw); 
String xmlString = sw.toString(); 

consigo la siguiente excepción:

javax.xml.bind.MarshalException 
    - with linked exception: 
    [com.sun.istack.SAXException2: unable to marshal type "mypackage.Req" as an element because it is missing an @XmlRootElement annotation] 

He echado un vistazo a las otras clases dentro de la biblioteca de terceros y ninguna de ellas usa la anotación @XmlRootElement. De cualquier forma alrededor de esto?

Respuesta

19

Puede utilizar JAXB y Marshall a cadena XML

JAXBContext context = JAXBContext.newInstance(Req.class); 
Marshaller marshaller = context.createMarshaller(); 
StringWriter sw = new StringWriter(); 
marshaller.marshal(instanceOfReq, sw); 

String xmlString = sw.toString(); 
+3

Una palabra de advertencia para el OP: 'JAXBContext's es costoso (lento) para crear. Crea y reutiliza una sola instancia. –

+1

Intenté usar JAXB y Marshall pero obtengo la MarshalException descrita en la publicación anterior. – ryan

+0

y no puede cambiar la clase Req para agregar la anotación XmlRoot? –

3

Addding a lo Bala R indicado, se puede hacer esto si su elemento JAXB no tienen la @xmlrootelement

JAXBContext context = JAXBContext.newInstance(YourClass.class); 
      Marshaller marshaller = context.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
      StringWriter sw = new StringWriter(); 
      JAXBElement jx = new JAXBElement(new QName("YourRootElement"), YourClass.class, input); 
      marshaller.marshal(jx, sw); 
      String xmlString = sw.toString(); 

Este también se declaró here.

Cuestiones relacionadas