web-dev-qa-db-fra.com

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

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

Rencontrer une exception lors de la décompression 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 ne contient que des données.

Quelque chose peut être la cause?

83
user496949

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

  1. Changez l'élément racine sur votre XML en "groupe"
  2. Ajoutez l'annotation @XmlRootElement (name = "Group") aux classes Group.
96
Blaise Doughan

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;
31
Ahmed Azraq

Heureusement, la classe package-info n'est pas requise. J'ai pu résoudre le problème des mines avec la solution 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 noms ajouté à @XmlRootElement, comme indiqué dans le message d'erreur.

20
Glenn Mason

Après avoir cherché plus, l'élément racine doit être associé à un espace de noms de schéma comme Blaise le note. Pourtant, je n'ai pas eu un paquet-information 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!

7
iowatiger08

C'est un correctif pour un cas d'utilisation assez intéressant, mais cela me convient à 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, un xml plus générique sera analysé. Essaie!

3
markthegrea

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
}

Mon cours 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
1
Aleksey Bykov

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

<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, qui corrigeait 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. 

0
Rashmi

Même chose pour moi. Le nom de la classe de mappage était Mbean mais le nom racine de la balise était mbean.

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

Vous devez mettre package-info.Java class 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;
0
ankit