2012-03-02 3 views
7

J'ai utilisé un fichier .xsd pour générer des classes Java, et avec un fichier XML, j'ai besoin de unmarshall.JAXB Unmarshall exception - élément inattendu

J'utilise ce code:

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(); 

et je reçois cette erreur:

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

J'ai vu beaucoup de solutions, mais rien ne fonctionne dans mon projet.

Qu'est-ce que je peux essayer de faire?

+0

Vous pouvez commencer par nous montrer le contenu de 'test.xml'. – skaffman

+0

Et le fichier xsd. –

Répondre

16

Votre racine xml ne dispose pas de l'attribut namespace (uri). Tu ferais mieux de l'essayer sur le XMLRootElement ...

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

namespace = "" était critique pour moi – dirkoneill

+0

vous voulez dire changer la classe Java auto-générée et ajouter cette annotation? – Line

+0

S'il faut modifier le code généré, pourquoi pas ... Je veux dire que ça peut être bogué ... –

4

Essayez

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

Puis-je l'utiliser avec une chaîne XML? – Line

+1

@Line StreamSource n'accepte que les sources InputStream, Reader et File. Mais vous pouvez utiliser 'StringReader' pour brancher votre chaîne XML. 'StreamSource streamSource = nouveau StreamSource (nouveau StringReader (xmlText));' – Stroboskop

Questions connexes