javax.xml.bind.UnmarshalException: несподіваний елемент (uri: “”, локальний: “Group”)


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

Зустрічайте виняток, коли знімаєте розміщення з xml

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

У груповому класі немає анотацій, а group.xml містить дані.

Що-небудь може бути причиною?


4
Для тих, хто приходить сюди з пошуку, я просто хочу прокоментувати, що це може бути спричинено використанням неправильних ObjectFactoryіз згенерованих джерел, що швидше за все, якщо ви змішуєте два різних генерованих вихідних каталогів.
барбаркер

Відповіді:


119

Схоже, у вашому XML-документі кореневий елемент "Група" замість "групи". Ти можеш:

  1. Змініть кореневий елемент у вашому XML на "груповий"
  2. Додайте примітку @XmlRootElement (name = "Група") до класів Group.

2
Це вирішило проблему, спасибі! Я використовував друге рішення, @XmlRootElement (name = "Група"). Назва мого класу - Група, а кореневим елементом XML є Група, чому мені ще потрібно name = "Група"
user496949


2
@BlaiseDoughan У мене є прямо протилежна проблема, у мене є, @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })але я отримую, що unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>я також маю @XmlElement(name="Date", required = true)над кожним полем. Де і чому йде не так? Я також спробував видалити @XmlRootElement!
Рахул Тхакур

4
Виникла проблема з @XmlSchemain package-info.java, виправлена ​​зараз.
Рахул Тхакур

35

Вам потрібно помістити package-info.java у створений пакет jaxb. Його зміст має бути чимось таким

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

33

На щастя, клас інформації про пакет не потрібен. Мені вдалося виправити проблему з рішенням iowatiger08.

Ось мій виправлення, яке показує повідомлення про помилку, щоб допомогти об’єднати точки для деяких.

Повідомлення про помилку

javax.xml.bind.UnmarshalException: несподіваний елемент (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", локальний: "errorresource"). Очікувані елементи - це {{} errorresource>

Код перед виправленням

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

Код після виправлення

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

Ви можете бачити простір імен, доданий до @XmlRootElement, як зазначено в повідомленні про помилку.


Зіткнувшись з тією ж проблемою, слідкуйте за вашим коментарем, і проблема вирішена Дякую.
Бібін Захарія

9

Подивившись більше, кореневий елемент повинен бути пов’язаний із простором імен схем, як зауважує Блейз. Тим не менш, я не мав java-info пакета. Тож без використання анотації @XMLSchema я зміг виправити цю проблему за допомогою

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

Сподіваюся, це допомагає!


додавання простору імен до кореневого елемента скелі! :-)
Костянтин Іванов

5

Це виправлення для гарного випадку використання ніші, але він отримує мене щоразу. Якщо ви використовуєте генератор Eclipse Jaxb, він створює файл під назвою package-info.

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

Якщо ви видалите цей файл, він дозволить проаналізувати більш загальний xml. Спробувати!


1
Це прокинулося ідеально після цього .. Дякую багато товариша .. :). Я просто зробив згаданий простір імен порожнім рядком.
Арундев

2

У мене була така ж проблема .. Це допомогло мені, я вказую ті самі назви полів своїх класів, що імена тегів у файлі xml (файл походить із зовнішньої системи).

Наприклад:

Мій 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>

Мій клас відповідей:

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

Мій клас 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
}

Клас мого предмета:

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

Клас "Мій регіон":

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

    // getters and setters here
}

Мій клас 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();
        }
    }
}

Це дає:

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

1

Вам потрібно поставити package-info.javaклас у пакет contextPath і поставити нижче код у тому ж класі:

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

0

Те саме мені. Ім'я класу відображення було, Mbeanале ім'я кореня тегу булоmbean таким, що мені довелося додати примітку:

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

0

У мене було те саме питання. Я додав такі атрибути до <xs:schema..> елементаForForumDefault = "кваліфікований" атрибутFormDefault = "некваліфікований"

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

і знову генерували класи java за допомогою запуску xjc, який виправляв package-info.java.

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

Це вирішило для мене проблему.


0

У мене вже є та сама проблема, і я просто змінююсь як нижче:

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

0

У мене була така ж проблема, моя проблема полягала в тому, що у мене були дві різні веб-сервіси з двома різними wsdl-файлами. Я створив джерела в одному пакеті для обох веб-сервісів, що, здається, є проблемою. Я думаю, це через ObjectFactory, а може бути, і через package-info.java - тому що вони генеруються лише один раз.

Я вирішив це, генеруючи джерела для кожної веб-служби в іншому пакеті. Таким чином, у вас також є два різних ObjectFactories та файли package-info.java.


0

Якщо ви з’їхали з розуму, оскільки це відбувається лише у ваших тестах, і ви використовуєте PowerMock, це рішення, додайте його поверх свого тестового класу:

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

0

Жодне із згаданих тут рішень не працювало для мене, я все одно отримував:

Виняток у потоці "main" javax.xml.bind.UnmarshalException: несподіваний елемент (uri: "java: XXX.XX.XX.XXX", локальний: "XXXXX")

Після безлічі досліджень на інших сайтах нижче код працював у мене,

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

Якщо жоден із перерахованих вище не працює, спробуйте додати

@XmlRootElement(name="Group") до групових класів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.