javax.xml.bind.UnmarshalException: elemento imprevisto (uri: "", local: "Group")


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

Incontra un'eccezione durante l'annullamento del marshalling da xml

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

La classe Group non ha alcuna annotazione e group.xml contiene solo dati.

Qualcosa può essere la causa?


4
Per coloro che vengono qui da una ricerca, voglio solo commentare che ciò può essere causato dall'uso errato ObjectFactorydelle fonti generate, il che è più probabile se stai mescolando due diverse directory dei sorgenti generate.
bbarker

Risposte:


119

Sembra che il tuo documento XML abbia l'elemento radice "Group" invece di "group". Puoi:

  1. Cambia l'elemento radice del tuo XML in "gruppo"
  2. Aggiungi l'annotazione @XmlRootElement (name = "Group") alle classi Group.

2
Ha risolto il problema, grazie! Ho usato la seconda soluzione, @XmlRootElement (name = "Group"). Il nome della mia classe è Gruppo e l'elemento radice XML è Gruppo, perché ho ancora bisogno di name = "Group"
user496949


2
@ BlaiseDoughan Sto avendo il problema esattamente opposto, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })ma unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>ho anche io @XmlElement(name="Date", required = true)su ogni campo. Dove e perché sta andando storto? Ho anche provato a rimuovere @XmlRootElement!
Rahul Thakur

4
Si è verificato un problema con @XmlSchemain package-info.java, risolto ora.
Rahul Thakur

35

Devi mettere package-info.java nel tuo pacchetto jaxb generato. Il suo contenuto dovrebbe essere qualcosa del genere

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

33

Fortunatamente, la classe di informazioni sul pacchetto non è richiesta. Sono stato in grado di risolvere il mio problema con la soluzione iowatiger08.

Ecco la mia correzione che mostra il messaggio di errore per aiutare a unire i punti per alcuni.

Messaggio di errore

javax.xml.bind.UnmarshalException: elemento imprevisto (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local: "errorresource"). Gli elementi previsti sono <{} errorresource>

Codice prima della correzione

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

Codice dopo correzione

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

È possibile visualizzare lo spazio dei nomi aggiunto a @XmlRootElement come indicato nel messaggio di errore.


Ha affrontato lo stesso problema e seguito il tuo commento e il problema è stato risolto. Grazie.
Bibin Zacharias

9

Dopo aver esaminato di più, l'elemento radice deve essere associato a uno spazio dei nomi dello schema come osserva Blaise. Tuttavia, non avevo un java per le informazioni sul pacchetto. Quindi, senza utilizzare l'annotazione @XMLSchema, sono stato in grado di correggere questo problema utilizzando

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

Spero che questo ti aiuti!


l'aggiunta di uno spazio dei nomi a un elemento radice è eccezionale! :-)
Konstantin Ivanov

5

Questa è una soluzione per un caso d'uso piuttosto di nicchia, ma mi prende ogni volta. Se stai usando il generatore Jaxb di Eclipse, crea un file chiamato package-info.

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

Se elimini questo file, consentirà di analizzare un XML più generico. Provaci!


1
Si è svegliato perfetto dopo che .. Grazie mille amico .. :). Ho appena trasformato lo spazio dei nomi menzionato in una stringa vuota.
Arundev

2

Ho avuto lo stesso problema .. Mi ha aiutato, sto specificando gli stessi nomi di campo delle mie classi come i nomi dei tag nel file xml (il file proviene da un sistema esterno).

Per esempio:

Il mio file 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>

La mia classe di risposta:

@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
}

La mia 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
}

La mia classe articolo:

@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
}

La mia classe RegionList:

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

    // getters and setters here
}

La mia lezione 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();
        }
    }
}

Dà:

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

1

È necessario inserire la package-info.javaclasse nel pacchetto di contextPath e inserire il codice seguente nella stessa classe:

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

0

Lo stesso per me. Il nome della classe di mappatura era Mbeanma il nome della radice del tag era mbeanquindi ho dovuto aggiungere l'annotazione:

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

0

Ho avuto lo stesso problema. Ho aggiunto i seguenti attributi a <xs:schema..> elementFormDefault = "qualificato" attributeFormDefault = "non qualificato"

<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" >

e le classi java rigenerate eseguendo xjc, che ha corretto package-info.java.

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

Questo ha risolto il problema per me.


0

Ho già lo stesso problema e cambio come di seguito:

@XmlRootElement -> @XmlRootElement(name="Group")

0

Ho avuto lo stesso problema, il mio problema era che avevo due diversi servizi web con due diversi file wsdl. Ho generato i sorgenti nello stesso pacchetto per entrambi i servizi web, il che sembra essere un problema. Immagino sia a causa di ObjectFactory e forse anche a causa di package-info.java, perché questi vengono generati solo una volta.

L'ho risolto generando i sorgenti per ogni servizio web in un pacchetto diverso. In questo modo, hai anche due diversi file ObjectFactories e package-info.java.


0

Nel caso in cui stai impazzendo perché questo accade solo nei tuoi test e stai usando PowerMock questa è la soluzione, aggiungila in cima alla tua classe di test:

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })

0

Nessuna delle soluzioni menzionate qui ha funzionato per me, stavo ancora ottenendo:

Eccezione nel thread "main" javax.xml.bind.UnmarshalException: elemento imprevisto (uri: "java: XXX.XX.XX.XXX", local: "XXXXX")

Dopo molte ricerche attraverso altri siti di seguito, il codice ha funzionato per me-

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

-1

Se nessuna delle soluzioni precedenti funziona, prova ad aggiungere

@XmlRootElement(name="Group") alle classi di gruppo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.