javax.xml.bind.UnmarshalException:意外的元素(uri:“”,local:“Group”)

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

在从xml解组时遇到exception

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

Group类没有任何注释,group.xml只包含数据。

任何事情都可能是原因?

它看起来像你的XML文档有根元素“组”而不是“组”。 您可以:

  1. 将您的XML的根元素更改为“组”
  2. 将批注@XmlRootElement(name =“Group”)添加到Group类。

您需要将package-info.java放入您生成的jaxb包中。 其内容应该是这样的

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

幸运的是,package-info类不是必需的。 我能用iowatiger08解决scheme解决我的问题。

这里是我的修复程序显示错误消息,以帮助join一些点。

错误信息

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的名称空间,如错误消息中所示。

在查看更多内容后,根元素必须与Blaise注意到的模式名称空间相关联。 然而,我没有包信息的Java。 所以,如果不使用@XMLSchema注释,我可以通过使用更正这个问题

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

希望这可以帮助!

这是一个很好的利基用例的修补程序,但它每次都得到我。 如果您正在使用Eclipse Jaxb生成器,则会创build一个名为package-info的文件。

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

如果你删除这个文件,它将允许更通用的xml被parsing。 试一试!

我有同样的问题..它帮助我,我指定我的类的相同的字段名称作为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")给Group类。

对我来说,简单的原因是像group.xml这样的文件名在类文件的错误混淆上被改变了。 看了反编译后的课,我意识到了。 所以首先检查引用的文件名是否正确,并在类path中可用。

我遇到过同样的问题。 我将以下属性添加到<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" > 

并通过运行xjc(更正了package-info.java)来重新生成java类。

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

这为我解决了这个问题。