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


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

Erfüllen Sie eine Ausnahme beim Entpacken aus XML

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

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

Alles kann die Ursache sein?


75
2018-03-05 10:50


Ursprung


Antworten:


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

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

89
2018-03-05 11:04



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

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

28
2017-08-16 07:27



Zum Glück ist die Paket-Info-Klasse nicht erforderlich. Ich war in der Lage, mein Problem mit iowatiger08 Lösung zu beheben.

Hier ist mein Update, das 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: "Fehlerquelle"). Erwartete Elemente sind <{} errorresource>

Code vor der Behebung

@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 Namespace zu @XmlRootElement hinzufügen, wie in der Fehlermeldung angegeben.


14
2017-08-28 05:18



Nach genauerer Betrachtung muss das Root-Element mit einem Schema-Namespace verknüpft werden, wie Blaise bemerkt. Aber ich hatte kein Paket-Info-Java. Ohne die @ XMLSchema-Annotation 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!


7
2018-02-12 22:05



Dies ist ein Fix für einen hübschen Nischen-Anwendungsfall, aber es bringt mich jedes Mal. 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 generischeres XML analysiert werden. Versuche es!


2
2018-05-11 16:07



Ich hatte das gleiche Problem .. Es half mir, ich gebe die gleichen Feldnamen meiner Klassen wie die Tag-Namen in der XML-Datei an (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 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
2017-09-21 11:57



Mir gleich. Der Name der Mapping-Klasse war Mbean aber der Tag root name war mbean also musste ich die Annotation hinzufügen:

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

0
2018-06-26 14:03