【问题标题】:javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Group")javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“组”)
【发布时间】:2011-07-09 08:48:19
【问题描述】:
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 类没有任何注解,group.xml 只包含数据。

有什么原因吗?

【问题讨论】:

  • 对于那些通过搜索来到这里的人,我只想评论一下,这可能是由于使用了生成源中不正确的ObjectFactory 造成的,如果您混合了两个不同的生成源,则更有可能发生这种情况目录。

标签: java xml jaxb


【解决方案1】:

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

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

【讨论】:

  • 解决了问题,谢谢!我使用了第二个解决方案,@XmlRootElement(name="Group")。我的类名是Group,XML根元素是Group,为什么我还需要name="Group"
  • @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 &lt;{}Date&gt;,&lt;{}MB&gt;,&lt;{}Time&gt;,我在每个字段上也有@XmlElement(name="Date", required = true)。哪里和为什么会出错?我也试过删除@XmlRootElement!
  • @XmlSchemapackage-info.java 中存在问题,现已修复。
【解决方案2】:

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

这是我的修复,它显示了错误消息,以帮助某些人加入点。

错误信息

javax.xml.bind.UnmarshalException:意外元素 (uri:"http://global.aon.bz/schema/cbs/archive/errorresource/0", 本地:“错误资源”)。预期元素是

修复前的代码

@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】:

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

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

【讨论】:

    【解决方案4】:

    如 Blaise 所指出的,在查看更多之后,根元素必须与模式命名空间相关联。然而,我没有 package-info 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。试试看!

    【讨论】:

    • 在那之后它醒来很完美.. 非常感谢队友.. :) 。我刚刚将提到的命名空间设置为空字符串。
    【解决方案6】:

    我遇到了同样的问题。它帮助了我,我指定了与 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
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          这里提到的解决方案都不适合我,我仍然得到:

          线程“主”javax.xml.bind.UnmarshalException 中的异常: 意外元素(uri:"java:XXX.XX.XX.XXX", local:"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();
          

          【讨论】:

          • 这是我的钱!
          【解决方案10】:

          我也一样。映射类的名称是Mbean,但标签根名称是mbean,所以我不得不添加注释:

          @XmlRootElement(name="mbean")
          public class MBean { ... }
          

          【讨论】:

            【解决方案11】:

            如果以上都不起作用,请尝试添加

            @XmlRootElement(name="Group") 到 Group 类。

            【讨论】:

            • 我已经删除了 package-info.java 并且它正在工作
            【解决方案12】:

            我有同样的问题。 我向&lt;xs:schema..&gt; 添加了以下属性 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)
            

            这为我解决了这个问题。

            【讨论】:

              【解决方案13】:

              我已经有同样的问题,我只是改变如下:

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

              【讨论】:

                【解决方案14】:

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

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

                【讨论】:

                  【解决方案15】:

                  所以当我使用不是我的 xsd 文件中的预生成类时,我遇到了你的例外。

                  生成的 xml 对象名称和命名空间(@xmlroot)从 java 类中丢失,所以我无法解组它。 像这样将缺少的 URI 放在类上方“解决”了问题:

                  @XmlRootElement(name = "XHE", namespace = "http://docs.oasis-open.org/bdxr/ns/XHE/1/ExchangeHeaderEnvelope")
                  public class XHEType {
                  

                  但由于我希望这个类只在目标中,这还不够。 我最终想出的是这个新类,用于将生成的类包装在我放置@xmlroot 的位置:

                  @XmlRootElement(name = "XHE", namespace = "http://docs.oasis-open.org/bdxr/ns/XHE/1/ExchangeHeaderEnvelope")
                  public class XHEType2  extends XHEType {
                  

                  以及解组代码:

                          JAXBContext jaxbContext = JAXBContext.newInstance(XHEType2.class);
                          javax.xml.bind.Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                          XHEType xheType = (XHEType) unmarshaller.unmarshal(reader);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多