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

时间:2011-03-05 10:50:09

标签: java xml jaxb

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只包含数据。

任何事情都可能是原因?

14 个答案:

答案 0 :(得分:98)

看起来您的XML文档的根元素是“Group”而不是“group”。你可以:

  1. 将XML上的根元素更改为“group”
  2. 将注释@XmlRootElement(name =“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")到小组课程。