当前位置: 首页 > 知识库问答 >
问题:

jaxb解组-意外的元素异常

黄景胜
2023-03-14

我尝试解组一个XML文件到一个对象。

我得到了这个错误:

javax.xml.bind.UnmarshalException: unexpected element (URI:"", lokal:"ORDER"). Expected elements are <{http://www.opentrans.org/XMLSchema/1.0}ACCOUNT>,<{http://www.opentrans.org/XMLSchema/1.0}ACCOUNTING_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}ADDRESS>,<{http://www.opentrans.org/XMLSchema/1.0}AGREEMENT>,<{http://www.opentrans.org/XMLSchema/1.0}ARTICLE_ID>,<{http://www.opentrans.org/XMLSchema/1.0}ARTICLE_PRICE>,<{http://www.opentrans.org/XMLSchema/1.0}BUYER_AID>,<{http://www.opentrans.org/XMLSchema/1.0}BUYER_PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}CARD>,<{http://www.opentrans.org/XMLSchema/1.0}CASH>,<{http://www.opentrans.org/XMLSchema/1.0}CATALOG_REFERENCE>,<{http://www.opentrans.org/XMLSchema/1.0}CHECK>,<{http://www.opentrans.org/XMLSchema/1.0}CONTACT>,<{http://www.opentrans.org/XMLSchema/1.0}CONTROL_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}COST_CATEGORY_ID>,<{http://www.opentrans.org/XMLSchema/1.0}DEBIT>,<{http://www.opentrans.org/XMLSchema/1.0}DELIVERY_DATE>,<{http://www.opentrans.org/XMLSchema/1.0}DELIVERY_PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}FINAL_DELIVERY_PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}INTERNATIONAL_AID>,<{http://www.opentrans.org/XMLSchema/1.0}INTERNATIONAL_RESTRICTIONS>,<{http://www.opentrans.org/XMLSchema/1.0}INVOICE_PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}MANUFACTURER_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}MIME>,<{http://www.opentrans.org/XMLSchema/1.0}MIME_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_HEADER>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_ITEM>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_ITEM_LIST>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_PARTIES>,<{http://www.opentrans.org/XMLSchema/1.0}ORDER_SUMMARY>,<{http://www.opentrans.org/XMLSchema/1.0}PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}PARTY_ID>,<{http://www.opentrans.org/XMLSchema/1.0}PAYMENT>,<{http://www.opentrans.org/XMLSchema/1.0}PAYMENT_TERM>,<{http://www.opentrans.org/XMLSchema/1.0}PHONE>,<{http://www.opentrans.org/XMLSchema/1.0}PRICE_FLAG>,<{http://www.opentrans.org/XMLSchema/1.0}PUBLIC_KEY>,<{http://www.opentrans.org/XMLSchema/1.0}REMARK>,<{http://www.opentrans.org/XMLSchema/1.0}SHIPMENT_PARTIES>,<{http://www.opentrans.org/XMLSchema/1.0}SOURCING_INFO>,<{http://www.opentrans.org/XMLSchema/1.0}SPECIAL_TREATMENT_CLASS>,<{http://www.opentrans.org/XMLSchema/1.0}SUPPLIER_PARTY>,<{http://www.opentrans.org/XMLSchema/1.0}TRANSPORT>,<{http://www.opentrans.org/XMLSchema/1.0}TRANSPORT_PARTY>

我的解组过程如下所示:

InputStream is = new FileInputStream(xmlfile);
JAXBContext jc = JAXBContext.newInstance( ORDER.class );
Unmarshaller u = jc.createUnmarshaller();
ORDER order = (ORDER) u.unmarshal(is);

我的XML实体看起来像:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "orderheader",
    "orderitemlist",
    "ordersummary"
})
@XmlRootElement(name = "ORDER")
public class ORDER {

    @XmlElement(name = "ORDER_HEADER", required = true)
    protected ORDERHEADER orderheader;
    @XmlElement(name = "ORDER_ITEM_LIST", required = true)
    protected ORDERITEMLIST orderitemlist;
    @XmlElement(name = "ORDER_SUMMARY", required = true)
    protected ORDERSUMMARY ordersummary;
    @XmlAttribute(name = "version")
    protected String version;
    @XmlAttribute(name = "type")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    protected String type;

    getters and setters
}

我的XMLFile看起来像:

<?xml version="1.0" encoding="UTF-8" ?>
<ORDER version="1.0" type="standard">
    <ORDER_HEADER>
        ...
    </ORDER_HEADER>
    <ORDER_ITEM_LIST>
        <ORDER_ITEM>
            ...
        </ORDER_ITEM>
    </ORDER_ITEM_LIST>
    <ORDER_SUMMARY>
        ...
    </ORDER_SUMMARY>
</ORDER>

那么,我的解组过程出了什么问题?XML实体是用xjc创建的。

我也尝试了简单的xml文件/对象。这对我来说很好。

共有1个答案

西门嘉澍
2023-03-14

错误消息基本上归结为:

javax.xml.bind.UnmarshalException:
  Unexpected element: <{}ORDER>
  Expected element: <{http://www.opentrans.org/XMLSchema/1.0}ORDER>

基本上,错误在于您的模式用于命名空间http://www.opentrans.org/XMLSchema/1.0,但是您的文档没有命名空间。

要让它发挥作用,你有三个选择:

  1. 将名称空间添加到XML数据

如果可能的话,我建议#1:

<?xml version="1.0" encoding="UTF-8" ?>
<ORDER version="1.0" type="standard" xmlns="http://www.opentrans.org/XMLSchema/1.0">
    <ORDER_HEADER>
        ...
    </ORDER_HEADER>
    <ORDER_ITEM_LIST>
        <ORDER_ITEM>
            ...
        </ORDER_ITEM>
    </ORDER_ITEM_LIST>
    <ORDER_SUMMARY>
        ...
    </ORDER_SUMMARY>
</ORDER>
 类似资料:
  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • 为什么在使用JAXB时需要使用? 我的工作场景是这样的: 我正在做一个从.NET到Java的转换项目。在.NET中,类的编写与POJO类似。我只是在代码中添加了注释(如、等)。并解决了与注释相关的错误。 现在我犯了这样的错误: XML文件如下: POJO类:

  • 我正在使用JAXB解析器将通过http请求发送的XML转换为Java对象,同时根据XSD模式对其进行验证。问题是,当调用unmarshal()方法时,它会引发以下异常: UnMarshalException:意外元素(URI:“http://www.somedomain.com/”,local:“assign”)。所需元素为(无) 如果从根XML元素中删除名称空间,它会引发相同的异常,uri部分为

  • Borrower类使用基于XSD的JaxB解析,使用JDK1.7和Eclipse IDE。 : } XSD: XML:

  • 我以xml字符串的形式从服务器返回响应,现在试图将其解压缩回对象中。 在指定的行上,我得到以下异常: UnmarshalException:意外元素(URI:“”,local:“ResponseBlock”)。需要的元素为<{}responseblocktype> 谁能让我知道我哪里出了问题?如果可能的话,我可以提供更多的信息。我从其他帖子中看到,在我的顶级bean响应类中添加@XmlRootel

  • 我尝试使用SOAP服务,用maven cxf-codegen-plugin生成存根。大多数服务都很好,除了一个难看的服务。在这种情况下,当被调用时,服务发送一个正确的响应,但是我生成的存根无法解组它,从而生成一个异常,比如(我用一个类似urlx的名称替换了URL,以简化) : javax.xml.ws.soap。SOAPFaultException:解组错误:意外元素(uri:“url3”,loc