2009-10-17 12 views
5

¡Saludos! Tengo un servidor de contenido XML de regresar a mi cliente que tiene este aspecto:JAXB para unmarshall <string> foobar</string>

<string xmlns="...">foobar</string> 

Soy nuevo en JAXB y han recibido una gran cantidad de cosas de trabajo, excepto esto. Pensé que sería bastante fácil reunir y desmantelar esto hacia y desde una Cadena. Me tomó un tiempo, pero al final me di cuenta de cómo calcular esto como

public static String ToXML(String s) throws Exception 
    { 
     JAXBContext context = JAXBContext.newInstance(String.class); 
     Marshaller marshaller = context.createMarshaller(); 
     StringWriter sw = new StringWriter(); 
     marshaller.marshal(new JAXBElement(new QName("", "String"), String.class, s), sw); 

     return sw.toString(); 
    } 

Así que mi pregunta es, ¿cómo me unmarshal esto? No puede ser anotado como un elemento raíz. No puedo usar java.lang como el paquete para crear una nueva instancia de un JAXBContext (recibo una excepción que falta en ObjectFactory).

¿Alguna sabiduría para impartir? Esto no puede ser tan difícil, ¿verdad?

Respuesta

3

Cuando usa JAXB, necesita compilar el código alrededor de un esquema XML. Es decir, si tiene un archivo, digamos foo.xsd, debe ejecutarlo a través del compilador xjc (en JDK 6 de forma predeterminada, de lo contrario, puede descargar JAXB 2 y usarlo). Eso leerá a través del esquema y generará el Java Bean y las clases asociadas de ObjectFactory con los elementos en el esquema. Las clases de Java Bean se verán como POJOs regulares con anotaciones. La implementación JAXB necesita las clases ObjectFactory para convertir el XML en el bean Java correspondiente. Esto explica su excepción faltante de ObjectFactory.

Así que no es difícil, pero hay que trabajar mucho. Lo usamos para una de nuestras aplicaciones de producción y es genial. Me veo usando más ahora que es parte del JDK.

+1

Un esquema XML es totalmente opcional con JAXB. Es perfectamente aceptable anotar a mano su propio modelo de objetos. – skaffman

+0

Es cierto, pero tener un conjunto de objetos generado por el esquema asegura la corrección en el documento (el documento se puede validar contra el esquema) y los objetos de Java (es fácil pasar por alto un campo). Puede repetir el proceso en múltiples aplicaciones y máquinas también. –

10

Necesita escribir un modelo de objetos que se ajuste a su estructura XML, y decirle a JAXB que se desmarque de eso. Su ejemplo puede parecer simple, pero JAXB no es para lo que es.

intentar algo como esto:

@XmlRootElement(name="string", namespace="blah") 
public class MyString { 
    @XmlValue 
    String value; 
} 

JAXBContext context = JAXBContext.newInstance(MyString.class); 
MyString myString = (MyString) context.createUnmarshaller().unmarshal(...); 

Esto deserializar el XML <string xmlns="blah">foobar</string>. Cambie el espacio de nombre en consecuencia. Si tiene muchos espacios de nombres, entonces JAXB no es realmente la herramienta para usted.

7

Me sorprendió por esto, pero la siguiente parece que funciona:

final String xmlString = "<string>value</string>"; 
final StringReader xmlReader = new StringReader(xmlString); 
final StreamSource xmlSource = new StreamSource(xmlReader); 
final JAXBContext jaxbContext = JAXBContext.newInstance(String.class); 
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
final String stringValue = unmarshaller.unmarshal(xmlSource, String.class).getValue(); 

es eso lo que estabas buscando?

Cuestiones relacionadas