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"));
组类没有任何注释,group.xml只包含数据。
任何事情都可能是原因?
答案 0 :(得分:98)
看起来您的XML文档的根元素是“Group”而不是“group”。你可以:
答案 1 :(得分:31)
您需要将package-info.java放入生成的jaxb包中。它的内容应该是那样的
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
答案 2 :(得分:21)
幸运的是,package-info类不是必需的。我能用iowatiger08解决方案解决我的问题。
这是我的修复显示错误消息,以帮助加入一些点。
错误消息
javax.xml.bind.UnmarshalException:意外元素 (URI: “http://global.aon.bz/schema/cbs/archive/errorresource/0”, 本地: “errorresource”)。预期元素为&lt; {} errorresource&gt;
修复前的代码
@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的命名空间,如错误消息中所示。
答案 3 :(得分:7)
在查看更多内容之后,根元素必须与Blaise注意到的模式命名空间相关联。然而,我没有一个package-info java。因此,在不使用@XMLSchema注释的情况下,我可以使用
来解决此问题@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}
希望这有帮助!
答案 4 :(得分:4)
这是针对一个非常小众用例的修复,但它每次都让我感觉到。如果您正在使用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。试一试!
答案 5 :(得分:1)
我有同样的问题..它帮助了我,我指定了我的类的相同字段名称作为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
答案 6 :(得分:0)
与我相同。映射类的名称为Mbean
,但标记根名称为mbean
,因此我必须添加注释:
@XmlRootElement(name="mbean")
public class MBean { ... }
答案 7 :(得分:0)
我有同样的问题。
我将以下属性添加到<xs:schema..>
的将elementFormDefault =&#34;合格&#34; attributeFormDefault =&#34;不合格&#34;
<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重新生成java类,这更正了package-info.java。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
这解决了我的问题。
答案 8 :(得分:0)
您需要将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;
答案 9 :(得分:0)
我已经遇到了相同的问题,只是做了如下更改:
@XmlRootElement -> @XmlRootElement(name="Group")
答案 10 :(得分:0)
我遇到了同样的问题,我的问题是,我有两个带有两个不同wsdl文件的不同Web服务。我在两个Web服务的同一包中生成了源,这似乎是一个问题。我猜这是由于ObjectFactory的原因,也可能是由于package-info.java的原因-因为它们仅生成一次。
我解决了这一问题,方法是在不同的程序包中为每个Web服务生成源。这样,您还将拥有两个不同的ObjectFactories和package-info.java文件。
答案 11 :(得分:0)
如果您因为只在测试中发生这种情况而发疯,并且您正在使用PowerMock,这就是解决方案,请将其添加到测试类的顶部:
@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })
答案 12 :(得分:0)
这里提到的所有解决方案都不适合我,但我仍然得到:
线程“ main”中的异常javax.xml.bind.UnmarshalException: 意外元素(uri:“ java:XXX.XX.XX.XXX”,本地:“ XXXXX”)
经过其他网站的大量研究,以下代码对我有用-
FileInputStream fis = new FileInputStream("D:/group.xml");
SOAPMessage message = factory.createMessage(new MimeHeaders(), fis);
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Group> r = u.unmarshal(message.getSOAPBody().extractContentAsDocument(), Group.class);
Group group = r.getValue();
答案 13 :(得分:-1)
如果上述方法均无效,请尝试添加
@XmlRootElement(name="Group")
到小组课程。