класса 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 ответов:
похоже, что ваш XML-документ имеет корневой элемент " Группа "вместо"группа". Вы можете:
- измените корневой элемент в XML на "group"
- добавьте аннотацию @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)
это исправило проблему для меня.