it-swarm.com.de

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

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

Treffen Sie eine Ausnahme, wenn Sie XML nicht mehr verwenden

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

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

Kann irgendetwas die Ursache sein?

83
user496949

Es sieht so aus, als hätte Ihr XML-Dokument das Wurzelelement "Gruppe" anstelle von "Gruppe". Sie können:

  1. Ändern Sie das Wurzelelement in Ihrem XML in "Gruppe".
  2. Fügen Sie die Annotation @XmlRootElement (name = "Group") zu den Group-Klassen hinzu.
96
Blaise Doughan

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

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

Hier ist mein Fix, der die Fehlermeldung zeigt, 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 ", local: "errorresource"). Erwartete Elemente sind <{} errorresource>

Code vor dem Update

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

Code nach Korrektur 

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

20
Glenn Mason

Nachdem Sie mehr gesucht haben, muss das Root-Element mit einem Schema-Namespace verknüpft werden, wie Blaise dies merkt. Ich hatte jedoch keine Paket-Info-Java. Ohne die @ XMLSchema-Annotation zu verwenden, konnte ich dieses Problem daher mit korrigieren

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

Hoffe das hilft!

7
iowatiger08

Dies ist ein Update für einen hübschen Nischen-Anwendungsfall, der mich jedoch jedes Mal aufs Neue erwischt. Wenn Sie den Eclipse-Jaxb-Generator verwenden, wird eine Datei mit dem Namen 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 ein generischer XML-Code analysiert werden. Versuche es!

3
markthegrea

Ich hatte das gleiche Problem .. Es hat mir geholfen. Ich habe die gleichen Feldnamen meiner Klassen wie die Tag-Namen in der XML-Datei angegeben (die Datei stammt aus einem externen System).

Zum Beispiel:

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

@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
1
Aleksey Bykov

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

<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 generierte Java-Klassen durch Ausführen von xjc neu, 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. 

0
Rashmi

Mir gleich. Der Name der Mapping-Klasse war Mbean, aber der Tag-Root-Name war mbean.

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

Sie müssen die Klasse package-info.Java 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;
0
ankit