Ответ 1
Похоже, ваш XML-документ имеет корневой элемент "Группа" вместо "группы". Вы можете:
- Измените корневой элемент на вашем XML как "группу"
- Добавить аннотацию @XmlRootElement (name= "Group" ) к классам группы.
unexpected element (uri:"", local:"Group"). Expected elements are <{}group>
Встречайте исключение при unmarshalling из xml
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));
Класс группы не имеет никакой аннотации, а group.xml содержит только данные.
Все может быть причиной?
Похоже, ваш XML-документ имеет корневой элемент "Группа" вместо "группы". Вы можете:
Вам нужно поставить package-info.java в ваш сгенерированный пакет jaxb. Его содержание должно быть чем-то вроде этого
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
К счастью, класс package-info не требуется. Я смог устранить проблему с помощью решения 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, как указано в сообщении об ошибке.
После просмотра более того, корневой элемент должен быть связан с пространством имен schema, как отмечает 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>
Класс 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
}
Мой класс 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
}
Класс My Item:
@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 { ... }
Для меня простая причина заключалась в том, что имя файла, например group.xml, было изменено при неправильном запутывании файла класса. Посмотрев на декомпилированный класс, я понял это. Поэтому сначала проверьте, правильно ли указано имя файла, и доступно в classpath.
У меня была такая же проблема.
Я добавил следующие атрибуты в <xs:schema..>
elementFormDefault = "квалифицированный" атрибутFormDefault = "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)
Это решило проблему для меня.
Вам нужно поместить класс 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;
У меня уже есть та же проблема, и я просто изменить, как показано ниже:
@XmlRootElement -> @XmlRootElement(name="Group")
Если ничего из вышеприведенного не работает, попробуйте добавить
@XmlRootElement(name="Group")
для классов группы.