javax.xml.bind.UnmarshalException: nieoczekiwany element (uri: „”, local: „Group”)


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

Spotkaj się z wyjątkiem podczas cofania odczytu z XML

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

Klasa Group nie ma adnotacji, a group.xml zawiera tylko dane.

Coś może być przyczyną?


4
Dla tych, którzy przychodzą tutaj z wyszukiwania, chcę tylko skomentować, że może to być spowodowane użyciem nieprawidłowego ObjectFactoryz wygenerowanych źródeł, co jest bardziej prawdopodobne, jeśli mieszasz dwa różne wygenerowane katalogi źródłowe.
bbarker

Odpowiedzi:


119

Wygląda na to, że Twój dokument XML zawiera element główny „Grupa” zamiast „grupa”. Możesz:

  1. Zmień element główny w pliku XML na „group”
  2. Dodaj adnotację @XmlRootElement (name = "Group") do klas Group.

2
Rozwiązał problem, dzięki! Użyłem drugiego rozwiązania, @XmlRootElement (name = "Group"). Nazwa mojej klasy to Group, a elementem głównym XML jest Group, dlaczego nadal potrzebuję name = "Group"
user496949


2
@BlaiseDoughan Mam dokładnie odwrotny problem, mam, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })ale dostaję, że unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>mam też @XmlElement(name="Date", required = true)na każdym polu. Gdzie i dlaczego dzieje się źle? Próbowałem też usunąć @XmlRootElement!
Rahul Thakur

4
Wystąpił problem z programem @XmlSchemaw package-info.java, naprawiony teraz.
Rahul Thakur

35

Musisz umieścić package-info.java w wygenerowanym pakiecie jaxb. Jego treść powinna być mniej więcej taka

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

34

Na szczęście klasa informacji o pakiecie nie jest wymagana. Udało mi się rozwiązać mój problem za pomocą rozwiązania iowatiger08.

Oto moja poprawka pokazująca komunikat o błędzie, aby pomóc niektórym połączyć kropki.

Komunikat o błędzie

javax.xml.bind.UnmarshalException: nieoczekiwany element (uri: „ http://global.aon.bz/schema/cbs/archive/errorresource/0 ”, local: „errorresource”). Oczekiwane elementy to <{} errorresource>

Kod przed poprawką

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

Kod po poprawce

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

Możesz zobaczyć przestrzeń nazw dodaną do @XmlRootElement, jak wskazano w komunikacie o błędzie.


Zmierzyłem się z tym samym problemem i zastosowałem się do Twojego komentarza, a problem został rozwiązany. Dziękuję Ci.
Bibin Zacharias

9

Po dokładniejszym przyjrzeniu się, element główny musi zostać powiązany z przestrzenią nazw schematu, jak zauważył Blaise. Nie miałem jeszcze pakietu java. Tak więc bez adnotacji @XMLSchema mogłem rozwiązać ten problem za pomocą

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

Mam nadzieję że to pomoże!


dodanie przestrzeni nazw do elementu głównego rzuca się w oczy! :-)
Konstantin Ivanov

5

To poprawka na całkiem niszowy przypadek użycia, ale za każdym razem mnie dostrzega. Jeśli używasz generatora Eclipse Jaxb, tworzy on plik o nazwie informacje o pakiecie.

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

Jeśli usuniesz ten plik, umożliwi to przeanalizowanie bardziej ogólnego pliku XML. Spróbuj!


1
Potem działało idealnie .. Wielkie dzięki kolego .. :). Właśnie utworzyłem wspomnianą przestrzeń nazw jako pusty ciąg.
Arundev

2

Miałem ten sam problem .. Pomogło mi, podaję takie same nazwy pól moich klas, jak nazwy tagów w pliku xml (plik pochodzi z systemu zewnętrznego).

Na przykład:

Mój plik 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>

Klasa My Response:

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

Moja klasa 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
}

Klasa mojego przedmiotu:

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

Moja klasa RegionList:

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

    // getters and setters here
}

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

To daje:

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

1

Musisz umieścić package-info.javaklasę w pakiecie contextPath i umieścić poniższy kod w tej samej klasie:

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

0

To samo dla mnie. Nazwa klasy mapowania była, Mbeanale nazwa główna znacznika była, mbeanwięc musiałem dodać adnotację:

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

0

Miałem ten sam problem. Dodałem następujące atrybuty do <xs:schema..> elementu elementFormDefault = "qualified" attributeFormDefault = "unqualified"

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

i ponownie wygenerowałem klasy java, uruchamiając xjc, co poprawiło informacje o pakiecie.java.

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

To rozwiązało problem.


0

Mam już ten sam problem i po prostu zmieniam jak poniżej:

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

0

Miałem ten sam problem, mój problem polegał na tym, że miałem dwie różne usługi sieciowe z dwoma różnymi plikami wsdl. Wygenerowałem źródła w tym samym pakiecie dla obu usług sieciowych, co wydaje się być problemem. Wydaje mi się, że dzieje się tak z powodu ObjectFactory, a być może także z powodu pliku package-info.java - ponieważ są one generowane tylko raz.

Rozwiązałem to, generując źródła dla każdej usługi sieciowej w innym pakiecie. W ten sposób masz również dwa różne pliki ObjectFactories i package-info.java.


0

Jeśli oszalejesz, ponieważ dzieje się to tylko w Twoich testach i używasz PowerMock, oto rozwiązanie, dodaj je do swojej klasy testowej:

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

0

Żadne z wymienionych tutaj rozwiązań nie zadziałało, nadal otrzymywałem:

Wyjątek w wątku „main” javax.xml.bind.UnmarshalException: nieoczekiwany element (uri: „java: XXX.XX.XX.XXX”, lokalny: „XXXXX”)

Po wielu badaniach w innych witrynach poniższy kod zadziałał dla mnie-

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

Jeśli żadne z powyższych nie działa, spróbuj dodać

@XmlRootElement(name="Group") do zajęć grupowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.