113 votes

javax.xml.bind.UnmarshalException : élément inattendu (uri : "", local : "Group")

unexpected element (uri:"", local:"Group"). Expected elements are <{}group>

Rencontrer une exception lors du désarchivage à partir de xml

JAXBContext jc = JAXBContext.newInstance(Group.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));

La classe Group n'a aucune annotation et le fichier group.xml ne contient que des données.

Quelque chose peut en être la cause ?

10 votes

Pour ceux qui viennent ici depuis une recherche, je veux juste commenter que cela peut être causé par l'utilisation d'un mauvais ObjectFactory à partir de generated-sources, ce qui est plus probable si vous mélangez deux différents répertoires de sources générées.

129voto

Blaise Doughan Points 75613

Il semble que votre document XML ait l'élément racine "Group" au lieu de "group". Vous pouvez le faire :

  1. Changez l'élément Root de votre XML en "groupe".
  2. Ajoutez l'annotation @XmlRootElement(name="Group") à la classe Group.

2 votes

Cela a résolu le problème, merci ! J'ai utilisé la deuxième solution, @XmlRootElement(name="Group"). Mon nom de classe est Group, et l'élément XML Root est Group, pourquoi ai-je encore besoin de name="Group" ?

1 votes

2 votes

@BlaiseDoughan J'ai le problème exactement inverse, j'ai @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" }) mais j'ai unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time> J'ai aussi @XmlElement(name="Date", required = true) sur chaque champ. Où et pourquoi cela ne va-t-il pas ? J'ai également essayé de supprimer @XmlRootElement !

44voto

Glenn Mason Points 1

Heureusement, la classe package-info n'est pas nécessaire. J'ai pu résoudre mon problème avec la solution de iowatiger08.

Voici mon correctif montrant le message d'erreur pour aider à joindre les points pour certains.

Message d'erreur

javax.xml.bind.UnmarshalException : élément inattendu (uri : " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local : "errorresource"). Les éléments attendus sont <{}errorresource>

Code avant correction

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource")
public class Errorresource

Code après correction

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource

Vous pouvez voir l'espace de nom ajouté à @XmlRootElement comme indiqué dans le message d'erreur.

0 votes

J'ai rencontré le même problème et j'ai suivi votre commentaire et le problème est résolu. Merci.

0 votes

Merci ! J'ai rencontré le même problème et j'ai pu le résoudre en suivant cette procédure.

0 votes

Cela devrait être la réponse acceptée, vraiment.

39voto

Ahmed Azraq Points 91

Vous devez mettre package-info.java dans votre paquet jaxb généré. Son contenu devrait ressembler à ceci

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;

9voto

iowatiger08 Points 480

En y regardant de plus près, l'élément Root doit être associé à un espace de nom de schéma, comme le fait remarquer Blaise. Pourtant, je n'avais pas de package-info java. Donc, sans utiliser l'annotation @XMLSchema, j'ai pu corriger ce problème en utilisant

@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}

J'espère que cela vous aidera !

0 votes

L'ajout d'un espace de nom à un élément Root est une excellente idée !)

0voto

Laura Liparulo Points 124

Pareil pour moi. Le nom de la classe de mappage était Mbean mais le nom du tag Root était mbean J'ai donc dû ajouter l'annotation :

@XmlRootElement(name="mbean")
public class MBean { ... }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X