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

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

Rencontrez une exception lors de la suppression du marshalling à partir de xml

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

La classe de groupe n'a aucune annotation et group.xml contient juste des données.

Quelque chose peut en être la cause?

user496949
la source
4
Pour ceux qui viennent ici d'une recherche, je veux juste dire que cela peut être causé par l'utilisation ObjectFactoryde sources incorrectes générées, ce qui est plus probable si vous mélangez deux répertoires sources générés différents.
bbarker

Réponses:

119

Il semble que votre document XML ait l'élément racine "Groupe" au lieu de "groupe". Vous pouvez:

  1. Remplacez l'élément racine de votre XML par "groupe"
  2. Ajoutez l'annotation @XmlRootElement (name = "Group") aux classes de groupe.
bdoughan
la source
2
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 racine XML est Group, pourquoi j'ai toujours besoin de name = "Group"
user496949
2
@BlaiseDoughan J'ai le problème exactement inverse, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })mais je reçois unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>aussi @XmlElement(name="Date", required = true)sur chaque champ. Où et pourquoi ça va mal? J'ai également essayé de supprimer @XmlRootElement!
Rahul Thakur
4
Il y avait un problème avec @XmlSchemain package-info.java, résolu maintenant.
Rahul Thakur
35

Vous devez mettre package-info.java dans votre package jaxb généré. Son contenu devrait être quelque chose comme ça

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

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

Voici mon correctif affichant 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 noms ajouté à @XmlRootElement comme indiqué dans le message d'erreur.

Glenn Mason
la source
Face au même problème et suivi de votre commentaire et le problème est résolu. Je vous remercie.
Bibin Zacharias
9

Après avoir cherché plus, l'élément racine doit être associé à un espace de nom de schéma comme Blaise le note. 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 t'aides!

iowatiger08
la source
l'ajout d'un espace de noms à un élément racine est génial! :-)
Konstantin Ivanov
5

C'est une solution pour un cas d'utilisation de niche, mais cela me touche à chaque fois. Si vous utilisez le générateur Eclipse Jaxb, il crée un fichier appelé package-info.

@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed")
package xxx.blah.mh.domain.pl3xx.startstop;

Si vous supprimez ce fichier, cela permettra à un XML plus générique d'être analysé. Essaie!

markthegrea
la source
1
Il s'est réveillé parfait après ça .. Merci beaucoup mon pote .. :). J'ai juste fait de l'espace de noms mentionné une chaîne vide.
Arundev
2

J'ai eu le même problème .. Cela m'a aidé, je spécifie les mêmes noms de champs de mes classes que les noms de balises dans le fichier xml (le fichier provient d'un système externe).

Par exemple:

Mon fichier xml:

<Response>
  <ESList>
     <Item>
        <ID>1</ID>
        <Name>Some name 1</Name>
        <Code>Some code</Code>
        <Url>Some Url</Url>
        <RegionList>
           <Item>
              <ID>2</ID>
              <Name>Some name 2</Name>
           </Item>
        </RegionList>
     </Item>
  </ESList>
</Response>

Ma classe de réponse:

@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
    @XmlElement
    private ESList[] ESList = new ESList[1]; // as the tag name in the xml file..

    // getter and setter here
}

Ma classe ESList:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ESList")
public class ESList {
    @XmlElement
    private Item[] Item = new Item[1]; // as the tag name in the xml file..

    // getters and setters here
}

Ma classe d'objets:

@XmlRootElement(name="Item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    @XmlElement
    private String ID; // as the tag name in the xml file..
    @XmlElement
    private String Name; // and so on...
    @XmlElement
    private String Code;
    @XmlElement
    private String Url;
    @XmlElement
    private RegionList[] RegionList = new RegionList[1];

    // getters and setters here
}

Ma classe RegionList:

@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
    Item[] Item = new Item[1];

    // getters and setters here
}

Ma classe DemoUnmarshalling:

public class DemoUnmarshalling {
    public static void main(String[] args) {
        try {
            File file = new File("...");

            JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            jaxbUnmarshaller.setEventHandler(
                new ValidationEventHandler() {
                    public boolean handleEvent(ValidationEvent event ) {
                        throw new RuntimeException(event.getMessage(),
                            event.getLinkedException());
                    }
                }
            );

            Response response = (Response) jaxbUnmarshaller.unmarshal(file);

            ESList[] esList = response.getESList();
            Item[] item = esList[0].getItem();
            RegionList[] regionLists = item[0].getRegionList();
            Item[] regionListItem = regionLists[0].getItem();

            System.out.println(item[0].getID());
            System.out.println(item[0].getName());
            System.out.println(item[0].getCode());
            System.out.println(item[0].getUrl());
            System.out.println(regionListItem[0].getID());
            System.out.println(regionListItem[0].getName());

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

Il donne:

1
Some name 1
Some code
Some Url
2
Some name 2

la source
1

Vous devez mettre la package-info.javaclasse dans le package de contextPath et mettre le code ci-dessous dans la même classe:

@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;
Ankit
la source
0

Même chose pour moi. Le nom de la classe de mappage était Mbeanmais le nom de la racine de la balise l'était mbeandonc j'ai dû ajouter l'annotation:

@XmlRootElement(name="mbean")
public class MBean { ... }
Laura Liparulo
la source
0

J'ai eu le même problème. J'ai ajouté les attributs suivants à <xs:schema..> elementFormDefault = "qualifié" attributeFormDefault = "unqualified"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/schemas/ArrayOfMarketWithStations"
    targetNamespace="http://www.example.com/schemas/ArrayOfMarketWithStations" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" >

et re-généré des classes java en exécutant xjc, ce qui a corrigé package-info.java.

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

Cela a résolu le problème pour moi.

Rashmi
la source
0

J'ai déjà le même problème et je change juste comme ci-dessous:

@XmlRootElement -> @XmlRootElement(name="Group")
rabieh eid
la source
0

J'ai eu le même problème, mon problème était que j'avais deux services Web différents avec deux fichiers wsdl différents. J'ai généré les sources dans le même package pour les deux services Web, ce qui semble être un problème. Je suppose que c'est à cause d'ObjectFactory et peut-être aussi à cause du package-info.java - parce que ceux-ci ne sont générés qu'une seule fois.

Je l'ai résolu, en générant les sources de chaque webservice dans un package différent. De cette façon, vous disposez également de deux fichiers ObjectFactories et package-info.java différents.

Sepultura
la source
0

Au cas où vous deviendriez fou parce que cela ne se produit que dans vos tests et que vous utilisez PowerMock, c'est la solution, ajoutez-la en haut de votre classe de test:

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })
Massimo
la source
0

Aucune des solutions mentionnées ici ne fonctionnait pour moi, j'obtenais toujours:

Exception dans le thread "main" javax.xml.bind.UnmarshalException: élément inattendu (uri: "java: XXX.XX.XX.XXX", local: "XXXXX")

Après de nombreuses recherches sur d'autres sites ci-dessous, le code a fonctionné pour moi-

FileInputStream fis = new FileInputStream("D:/group.xml");
SOAPMessage message = factory.createMessage(new MimeHeaders(), fis);
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Group> r = u.unmarshal(message.getSOAPBody().extractContentAsDocument(), Group.class);
Group group = r.getValue();
Xavi
la source
-1

Si aucune des solutions ci-dessus ne fonctionne, essayez d'ajouter

@XmlRootElement(name="Group") aux classes de groupe.

FOO
la source