javax.xml.bind.UnmarshalException: unerwartetes Element (uri: "", local: "Group")

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

Treffen Sie eine Ausnahme, wenn Sie das Marshalling von XML aufheben

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

Die Gruppenklasse hat keine Annotation und group.xml enthält nur Daten.

Kann irgendetwas die Ursache sein?

user496949
quelle
4
Für diejenigen, die von einer Suche hierher kommen, möchte ich nur kommentieren, dass dies durch die Verwendung der falschen ObjectFactoryaus generierten Quellen verursacht werden kann, was wahrscheinlicher ist, wenn Sie zwei verschiedene generierte Quellverzeichnisse mischen.
Barker

Antworten:

119

Es sieht so aus, als ob Ihr XML-Dokument das Stammelement "Gruppe" anstelle von "Gruppe" hat. Sie können:

  1. Ändern Sie das Stammelement in Ihrem XML in "Gruppe".
  2. Fügen Sie den Gruppenklassen die Anmerkung @XmlRootElement (name = "Group") hinzu.
bdoughan
quelle
2
Es hat das Problem gelöst, danke! Ich habe die zweite Lösung verwendet, @XmlRootElement (name = "Group"). Mein Klassenname ist Group und das XML-
Stammelement
1
Überprüfen Sie heraus: stackoverflow.com/questions/5203531/…
bdoughan
2
@BlaiseDoughan Ich habe das genau entgegengesetzte Problem, das ich habe, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })aber ich bekomme, dass unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>ich auch @XmlElement(name="Date", required = true)über jedes Feld habe. Wo und warum läuft es falsch? Ich habe auch versucht zu entfernen @XmlRootElement!
Rahul Thakur
4
Es gab ein Problem mit @XmlSchemain package-info.java, das jetzt behoben wurde.
Rahul Thakur
35

Sie müssen package-info.java in Ihr generiertes jaxb-Paket einfügen. Sein Inhalt sollte so etwas sein

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

Zum Glück ist die Paket-Info-Klasse nicht erforderlich. Ich konnte mein Problem mit der iowatiger08-Lösung beheben.

Hier ist mein Fix, der die Fehlermeldung anzeigt, um die Punkte für einige zu verbinden.

Fehlermeldung

javax.xml.bind.UnmarshalException: Unerwartetes Element (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", lokal: "errorresource"). Erwartete Elemente sind <{} Fehlerquelle>

Code vor dem Fix

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

Code nach dem Fix

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

Sie können den zu @XmlRootElement hinzugefügten Namespace sehen, wie in der Fehlermeldung angegeben.

Glenn Mason
quelle
Konfrontierte das gleiche Problem und folgte Ihrem Kommentar und das Problem ist behoben. Danke dir.
Bibin Zacharias
9

Nachdem Sie sich mehr angesehen haben, muss das Root-Element einem Schema-Namespace zugeordnet werden, wie Blaise bemerkt. Ich hatte jedoch kein Paket-Info-Java. Ohne die Annotation @XMLSchema zu verwenden, konnte ich dieses Problem mithilfe von beheben

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

Hoffe das hilft!

iowatiger08
quelle
Hinzufügen eines Namespace zu einem Root-Element rockt! :-)
Konstantin Ivanov
5

Dies ist eine Lösung für einen hübschen Nischen-Anwendungsfall, aber es bringt mich jedes Mal. Wenn Sie den Eclipse Jaxb-Generator verwenden, wird eine Datei namens package-info erstellt.

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

Wenn Sie diese Datei löschen, kann eine allgemeinere XML-Datei analysiert werden. Versuche es!

markthegrea
quelle
1
Danach erwachte es perfekt. Vielen Dank, Kumpel. :). Ich habe gerade den erwähnten Namespace zum leeren String gemacht.
Arundev
2

Ich hatte das gleiche Problem. Es hat mir geholfen, ich gebe die gleichen Feldnamen meiner Klassen an wie die Tag-Namen in der XML-Datei (die Datei stammt von einem externen System).

Beispielsweise:

Meine XML-Datei:

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

Meine Antwortklasse:

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

Meine ESList-Klasse:

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

Meine Gegenstandsklasse:

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

Meine RegionList-Klasse:

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

    // getters and setters here
}

Meine DemoUnmarshalling-Klasse:

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

Es gibt:

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

quelle
1

Sie müssen die package-info.javaKlasse in das Paket contextPath einfügen und den folgenden Code in dieselbe Klasse einfügen:

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

Mir gleich. Der Name der Zuordnungsklasse war, Mbeanaber der Tag-Stammname war, mbeanalso musste ich die Anmerkung hinzufügen:

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

Ich hatte das gleiche Problem. Ich habe elementFormDefault = "qualifiziert" folgende Attribute hinzugefügt <xs:schema..> attributeFormDefault = "unqualifiziert"

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

und neu generierte Java-Klassen durch Ausführen von xjc, wodurch package-info.java korrigiert wurde.

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

Dies hat das Problem für mich behoben.

Rashmi
quelle
0

Ich habe bereits das gleiche Problem und ändere mich wie folgt:

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

Ich hatte das gleiche Problem, mein Problem war, dass ich zwei verschiedene Webservices mit zwei verschiedenen WSDL-Dateien hatte. Ich habe die Quellen für beide Webservices im selben Paket generiert, was ein Problem zu sein scheint. Ich denke, es liegt an der ObjectFactory und vielleicht auch an der package-info.java - weil diese nur einmal generiert werden.

Ich habe es gelöst, indem ich die Quellen für jeden Webservice in einem anderen Paket generiert habe. Auf diese Weise haben Sie auch zwei verschiedene ObjectFactories- und package-info.java-Dateien.

Sepultura
quelle
0

Wenn Sie verrückt werden, weil dies nur in Ihren Tests passiert und Sie PowerMock verwenden, ist dies die Lösung. Fügen Sie sie zusätzlich zu Ihrer Testklasse hinzu:

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

Keine der hier genannten Lösungen funktionierte für mich, ich bekam immer noch:

Ausnahme im Thread "main" javax.xml.bind.UnmarshalException: unerwartetes Element (uri: "java: XXX.XX.XX.XXX", lokal: "XXXXX")

Nach vielen Recherchen auf anderen Websites hat der folgende Code für mich funktioniert.

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
quelle
-1

Wenn keines der oben genannten Verfahren funktioniert, versuchen Sie es hinzuzufügen

@XmlRootElement(name="Group") zu den Gruppenklassen.

FOO
quelle