класса javax.XML.связывать.UnmarshalException: непредвиденный элемент (uri:"", local: "Group")


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

класс группы не имеет никаких аннотаций и групп.xml просто содержит данные.

что может быть причиной?

9 79

9 ответов:

похоже, что ваш XML-документ имеет корневой элемент " Группа "вместо"группа". Вы можете:

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

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

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

к счастью, класс package-info не требуется. Я смог исправить свою проблему с помощью решения iowatiger08.

вот мой исправить, показывая сообщение об ошибке, чтобы помочь соединить точки для некоторых.

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

javax.XML.связывать.UnmarshalException: неожиданный элемент (uri:"http://global.aon.bz/schema/cbs/archive/errorresource/0", local:"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, как указано в сообщении об ошибке.

после просмотра больше, корневой элемент должен быть связан с пространством имен схемы, как отмечает Blaise. Тем не менее, у меня не было пакета-информация java. Поэтому, не используя аннотацию @XMLSchema, я смог исправить эту проблему с помощью

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

надеюсь, что это помогает!

Это решение довольно специфичный случай использования, но он получает меня каждый раз. Если вы используете генератор 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. Дайте ему попробовать!

у меня была та же проблема.. Это помогло мне, я указываю те же имена полей моих классов, что и имена тегов в 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

мне тоже. Имя класса отображения было Mbean но корень имя тега mbean поэтому мне пришлось добавить аннотацию:

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

Если ничего из вышеперечисленного не работает, попробуйте добавить

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

у меня была та же проблема. Я добавил следующие атрибуты в <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,который исправил информацию о пакете.Ява.

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

это исправило проблему для меня.