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文档有根元素“组”而不是“组”。 您可以:
- 将您的XML的根元素更改为“组”
- 将批注@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)
这为我解决了这个问题。