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

use*_*949 92 java xml jaxb

unexpected element (uri:"", local:"Group"). Expected elements are <{}group>
Run Code Online (Sandbox Code Playgroud)

从xml解组时遇到异常

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

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

什么都可能是原因?

bdo*_*han 108

看起来您的XML文档的根元素是"Group"而不是"group".您可以:

  1. 将XML上的根元素更改为"组"
  2. 将注释@XmlRootElement(name ="Group")添加到Group类.

  • 在`package-info.java`中存在`@ XmlSchema`的问题,现在修复了. (4认同)
  • 它解决了这个问题,谢谢!我使用了第二个解决方案@XmlRootElement(name ="Group").我的类名是Group,而XML根元素是Group,为什么我还需要name ="Group" (2认同)
  • @BlaiseDoughan我遇到了完全相反的问题,我有`@XmlRootElement(name ="MB")@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name ="MB",propOrder = {"date","time"} )``但我得到'意外元素(uri:"http://xx.title.com/new/response",本地:"MB").预期的元素是<{} Date>,<{} MB>,<{} Time>`我在每个字段上也有`@XmlElement(name ="Date",required = true)`.哪里以及为什么会出错?我也尝试删除`@ XmlRootElement`! (2认同)

小智 33

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

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


小智 29

幸运的是,package-info类不是必需的.我能用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
Run Code Online (Sandbox Code Playgroud)

修复后的代码

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource
Run Code Online (Sandbox Code Playgroud)

您可以看到添加到@XmlRootElement的命名空间,如错误消息中所示.


iow*_*r08 8

在查看更多内容之后,根元素必须与Blaise注意到的模式命名空间相关联.然而,我没有一个package-info java.因此,在不使用@XMLSchema注释的情况下,我能够通过使用来纠正此问题

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

希望这可以帮助!


mar*_*rea 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;
Run Code Online (Sandbox Code Playgroud)

如果删除此文件,它将允许解析更通用的xml。试试看!