javax.xml.bind.UnmarshalException: неожиданный элемент (uri: «», local: «Группа»)


104
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из сгенерированных источников, что более вероятно, если вы смешиваете два разных сгенерированных исходных каталога.
bbarker

Ответы:


119

Похоже, в вашем XML-документе есть корневой элемент «Группа» вместо «группа». Ты можешь:

  1. Измените корневой элемент в вашем XML на "группу"
  2. Добавьте аннотацию @XmlRootElement (name = "Group") в класс Group.

2
Это решило проблему, спасибо! Я использовал второе решение, @XmlRootElement (name = "Group"). Имя моего класса - Group, а корневой элемент XML - Group, почему мне все еще нужно name = "Group"
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
Был вопрос с @XmlSchemaин package-info.java, теперь исправлена.
Рахул Такур

35

Вам нужно поместить package-info.java в созданный вами пакет jaxb. Его содержание должно быть примерно таким

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

34

К счастью, класс информации о пакете не требуется. Я смог решить мою проблему с помощью решения iowatiger08.

Вот мое исправление, показывающее сообщение об ошибке, чтобы помочь некоторым объединить точки.

Сообщение об ошибке

javax.xml.bind.UnmarshalException: неожиданный элемент (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local: "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 с информацией о пакете. Поэтому, не используя аннотацию @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
После этого он проснулся идеально .. Большое спасибо, дружище .. :). Я просто сделал упомянутое пространство имен пустой строкой.
Arundev

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
}

Мой класс RegionList:

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

и повторно сгенерировал классы 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.