2012-03-02 139 views
7

He utilizado un archivo .xsd para generar clases de Java y, con un archivo XML, necesito deshacer la oposición.Excepción de JAXB Unmarshall: elemento inesperado

estoy utilizando este código:

JAXBContext objJAXBContext = JAXBContext.newInstance("my.test"); 

// create an Unmarshaller 
Unmarshaller objUnmarshaller = objJAXBContext.createUnmarshaller(); 

FileInputStream fis = new FileInputStream("test.xml"); 

JAXBElement<Root> objMyRoot = (JAXBElement<Root>) objUnmarshaller.unmarshal(fis); 

Root mRoot = objMyRoot.getValue(); 

y yo estoy recibiendo este error:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Root"). Expected elements are (none) 

he visto muchas soluciones pero nada funciona en mi proyecto.

¿Qué puedo intentar hacer?

+0

puede empezar por que nos muestra los contenidos de 'test.xml'. – skaffman

+0

Y el archivo xsd. –

Respuesta

16

A su raíz xml le falta el atributo de espacio de nombres (uri). Es mejor intentar esto en el XMLRootElement ...

@XmlRootElement(name = "root", namespace="") 
+0

namespace = "" fue crítico para mí – dirkoneill

+0

¿Quiere decir cambiar la clase de Java autogenerada y agregarle esta anotación? – Line

+0

Si se necesita cambiar el código generado, ¿por qué no? Quiero decir que puede tener errores ... –

4

Trate

StreamSource streamSource = new StreamSource("test.xml") 
JAXBElement<Root> objMyRoot = (JAXBElement<Root>) objUnmarshaller.unmarshal(streamsource, Root.class); 
+0

¿Puedo usarlo con cadenas XML? – Line

+1

@Line StreamSource solo acepta fuentes InputStream, Reader y File. Pero puede usar un 'StringReader' para conectar su cadena XML. 'StreamSource streamSource = new StreamSource (new StringReader (xmlText));' – Stroboskop

Cuestiones relacionadas