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


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

有什么原因吗?


4
对于那些来自搜索的用户,我只想评论这可能是由于使用了错误ObjectFactory的生成源引起的,如果您将两个不同的生成源目录混合使用,则更有可能。
bbarker '17

Answers:


119

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

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

2
它解决了问题,谢谢!我使用了第二个解决方案@XmlRootElement(name =“ Group”)。我的班级名称是Group,XML根元素是Group,为什么我仍然需要name =“ Group”
user496949 2011年


2
@BlaiseDoughan我遇到了完全相反的问题,@XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })但是我正在每个领域unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>都遇到@XmlElement(name="Date", required = true)。在哪里和为什么会出问题?我也尝试过删除@XmlRootElement
拉胡尔·塔库尔

4
@XmlSchemain中存在一个问题package-info.java,现已修复。
拉胡尔·塔库尔

35

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

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

33

幸运的是,不需要package-info类。我能够使用iowatiger08解决方案来解决我的问题。

这是我的修复程序,其中显示了错误消息,以帮助某些人加点。

错误信息

javax.xml.bind.UnmarshalException:意外元素(uri:“ http://global.aon.bz/schema/cbs/archive/errorresource/0 “,本地:“ 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的名称空间。


面对相同的问题,并按照您的评论进行操作,问题已解决。谢谢。
Bibin Zacharias,

9

看得更多之后,就像Blaise所指出的那样,根元素必须与模式命名空间相关联。但是,我没有程序包信息java。因此,无需使用@XMLSchema批注,我就可以通过使用以下方式纠正此问题:

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

希望这可以帮助!


在根元素上添加名称空间真是太难了!:-)
康斯坦丁·伊万诺夫

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;

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


1
在那之后它完美地醒了..非常感谢队友.. :) 我只是将提到的命名空间设为空字符串。
阿伦杰夫

2

我遇到了同样的问题。这对我有帮助,我在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
}

我的演示解组课:

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

1

您需要将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;


0

我遇到过同样的问题。我将以下属性添加到<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重新生成了Java类,该类更正了package-info.java。

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

这为我解决了这个问题。


0

我已经遇到了同样的问题,我只做了如下更改:

@XmlRootElement -> @XmlRootElement(name="Group")

0

我有同样的问题,我的问题是,我有两个带有两个不同wsdl文件的不同Web服务。我在两个Web服务的同一包中生成了源,这似乎是一个问题。我猜这是因为ObjectFactory,也可能是因为package-info.java-因为它们只生成一次。

我通过在不同的包中为每个Web服务生成源来解决了它。这样,您还有两个不同的ObjectFactories和package-info.java文件。


0

如果您因为只在测试中发生这种情况而发疯,并且您正在使用PowerMock,这就是解决方案,请将其添加到测试类的顶部:

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })

0

这里提到的解决方案都没有对我有用,但我仍然得到:

线程“主”中的异常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();

-1

如果以上方法均无效,请尝试添加

@XmlRootElement(name="Group") 到小组班级。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.