Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是

Posted

技术标签:

【中文标题】Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是【英文标题】:Jaxb UnMarshal Error : unexpected element (uri:"", local:"processedSalesOrderTypeList"). Expected elements are 【发布时间】:2017-08-14 02:58:37 【问题描述】:

我正在尝试解组 XML 文件。我创建了 Jaxb 类,但是当我尝试解组时,它给了我:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"processedSalesOrderTypeList"). Expected elements are <api.supplieroasis.comprocessedSalesOrderMessage>,<api.supplieroasis.comsalesOrderMessage>,<api.supplieroasis.comshipperOfRecordAccountNumber>,<api.supplieroasis.comshippingAccountNumber>,<api.supplieroasis.comuspsMailerId>,<api.supplieroasis.comwarehouseName>

这是我的 ObjectFactory.java 类:

@XmlRegistry
public class ObjectFactory 

    private final static QName _ProcessedSalesOrderMessage_QNAME = new QName("api.supplieroasis.com", "processedSalesOrderMessage");
    private final static QName _WarehouseName_QNAME = new QName("api.supplieroasis.com", "warehouseName");
    private final static QName _ShippingAccountNumber_QNAME = new QName("api.supplieroasis.com", "shippingAccountNumber");
    private final static QName _ShipperOfRecordAccountNumber_QNAME = new QName("api.supplieroasis.com", "shipperOfRecordAccountNumber");
    private final static QName _SalesOrderMessage_QNAME = new QName("api.supplieroasis.com", "salesOrderMessage");
    private final static QName _UspsMailerId_QNAME = new QName("api.supplieroasis.com", "uspsMailerId");


XSD:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="api.example.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="salesChannelOrderNumber" type="xs:string"/>
  <xs:element name="salesChannelName" type="xs:string"/>
  <xs:element name="orderDate" type="xs:dateTime"/>
  <xs:element name="sofsCreatedDate" type="xs:dateTime"/>
  <xs:element name="warehouseName">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="code"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="shipToAddress">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="contactName"/>
        <xs:element type="xs:string" name="address1"/>
        <xs:element type="xs:string" name="city"/>
        <xs:element type="xs:string" name="stateOrProvince"/>
        <xs:element type="xs:int" name="postalCode"/>
        <xs:element type="xs:string" name="countryCode"/>
        <xs:element type="xs:string" name="phone"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="returnAddress">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="contactName"/>
        <xs:element type="xs:string" name="address1"/>
        <xs:element type="xs:string" name="city"/>
        <xs:element type="xs:string" name="stateOrProvince"/>
        <xs:element type="xs:int" name="postalCode"/>
        <xs:element type="xs:string" name="countryCode"/>
        <xs:element type="xs:string" name="phone"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="shippingSpecifications">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="isThirdPartyBilling"/>
        <xs:element type="xs:string" name="isSignatureRequired"/>
        <xs:element type="xs:string" name="isDeclaredValueRequired"/>
        <xs:element name="smallParcelShipment">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="shippingServiceLevel">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element type="xs:string" name="code"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element type="xs:string" name="isExport"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="branding" type="xs:string"/>
  <xs:element name="orderFulfillment" type="xs:string"/>
  <xs:element name="orderId" type="xs:int"/>
  <xs:element name="status" type="xs:string"/>
  <xs:element name="retailChannelCode" type="xs:string"/>
  <xs:element name="retailerOrderCode" type="xs:string"/>
  <xs:element name="retailOrderNumber" type="xs:int"/>
  <xs:element name="actionRequired" type="xs:string"/>
  <xs:element name="processedSalesOrderLine">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:byte" name="salesChannelLineId"/>
        <xs:element type="xs:byte" name="salesChannelLineNumber"/>
        <xs:element type="xs:string" name="partnerSKU"/>
        <xs:element type="xs:string" name="barcode"/>
        <xs:element type="xs:string" name="salesChannelSKU"/>
        <xs:element type="xs:byte" name="quantity"/>
        <xs:element type="xs:float" name="itemPrice"/>
        <xs:element type="xs:int" name="lineId"/>
        <xs:element type="xs:int" name="itemId"/>
        <xs:element type="xs:string" name="itemName"/>
        <xs:element type="xs:string" name="lineStatus"/>
        <xs:element type="xs:float" name="unitCost"/>
        <xs:element type="xs:string" name="unitCostCurrencyCode"/>
        <xs:element type="xs:float" name="firstCost" minOccurs="0"/>
        <xs:element type="xs:string" name="firstCostCurrencyCode" minOccurs="0"/>
        <xs:element type="xs:float" name="additionalShippingCost" minOccurs="0"/>
        <xs:element type="xs:string" name="additionalShippingCostCurrencyCode" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

要解析的 XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<processedSalesOrderTypeList xmlns:ns2="api.example.com">
    <totalCount>4</totalCount>
    <list>
        <ns2:salesChannelOrderNumber>17456-1</ns2:salesChannelOrderNumber>
        <ns2:salesChannelName>OSTK</ns2:salesChannelName>
        <ns2:orderDate>2017-02-09T13:25:59.000-07:00</ns2:orderDate>
        <ns2:sofsCreatedDate>2017-02-09T09:40:19.000-07:00</ns2:sofsCreatedDate>
        <ns2:warehouseName>
            <ns2:code>Avia Warehouse</ns2:code>
        </ns2:warehouseName>
        <ns2:shipToAddress>
            <ns2:contactName>TestOrder1</ns2:contactName>
            <ns2:address1>5961 Adam Street</ns2:address1>
            <ns2:city>Salt Lake City</ns2:city>
            <ns2:stateOrProvince>UT</ns2:stateOrProvince>
            <ns2:postalCode>84047</ns2:postalCode>
            <ns2:countryCode>US</ns2:countryCode>
            <ns2:phone>801-555-5961</ns2:phone>
        </ns2:shipToAddress>
        <ns2:returnAddress>
            <ns2:contactName>Joe User-1355</ns2:contactName>
            <ns2:address1>1355 Adam Street</ns2:address1>
            <ns2:city>Salt Lake City</ns2:city>
            <ns2:stateOrProvince>UT</ns2:stateOrProvince>
            <ns2:postalCode>84047</ns2:postalCode>
            <ns2:countryCode>US</ns2:countryCode>
            <ns2:phone>801-555-1355</ns2:phone>
        </ns2:returnAddress>
        <ns2:shippingSpecifications>
            <ns2:isThirdPartyBilling>false</ns2:isThirdPartyBilling>
            <ns2:isSignatureRequired>false</ns2:isSignatureRequired>
            <ns2:isDeclaredValueRequired>false</ns2:isDeclaredValueRequired>
            <ns2:smallParcelShipment>
                <ns2:shippingServiceLevel>
                    <ns2:code>GROUND</ns2:code>
                </ns2:shippingServiceLevel>
            </ns2:smallParcelShipment>
            <ns2:isExport>false</ns2:isExport>
        </ns2:shippingSpecifications>
        <ns2:branding/>
        <ns2:orderFulfillment>ALLOW_PARTIAL_FILL</ns2:orderFulfillment>
        <ns2:orderId>50048</ns2:orderId>
        <ns2:status>PROCESSING</ns2:status>
        <ns2:retailChannelCode>OSTK_1716</ns2:retailChannelCode>
        <ns2:retailerOrderCode>OrderCode-123459790</ns2:retailerOrderCode>
        <ns2:retailOrderNumber>123459790</ns2:retailOrderNumber>
        <ns2:actionRequired>true</ns2:actionRequired>
        <ns2:processedSalesOrderLine>
            <ns2:salesChannelLineId>1</ns2:salesChannelLineId>
            <ns2:salesChannelLineNumber>1</ns2:salesChannelLineNumber>
            <ns2:partnerSKU>GPI42829404</ns2:partnerSKU>
            <ns2:barcode>GPI42829404</ns2:barcode>
            <ns2:salesChannelSKU>GPI42829404</ns2:salesChannelSKU>
            <ns2:quantity>1</ns2:quantity>
            <ns2:itemPrice>81.98</ns2:itemPrice>
            <ns2:lineId>58838</ns2:lineId>
            <ns2:itemId>217412</ns2:itemId>
            <ns2:itemName>Altimair TPU Camping Airmat with Built-in Foot Pump</ns2:itemName>
            <ns2:lineStatus>PROCESSING</ns2:lineStatus>
            <ns2:unitCost>0.00</ns2:unitCost>
            <ns2:unitCostCurrencyCode>USD</ns2:unitCostCurrencyCode>
            <ns2:firstCost>41.60</ns2:firstCost>
            <ns2:firstCostCurrencyCode>USD</ns2:firstCostCurrencyCode>
            <ns2:additionalShippingCost>0.00</ns2:additionalShippingCost>
            <ns2:additionalShippingCostCurrencyCode>USD</ns2:additionalShippingCostCurrencyCode>
        </ns2:processedSalesOrderLine>
    </list>
</processedSalesOrderTypeList>

您能否提供帮助,因为我被卡住了,无法向我的客户提供延迟开发此功能的原因。

谢谢, 杰伊什·贾恩

【问题讨论】:

您的xsd 中没有processedSalesOrderTypeList ... @Plirkee - 是的,我知道 XSD 中没有它,但是当我收到 XML 响应时,这个标签就在那里。我尝试从 XML 创建 XSD,然后从新的 XSD 生成 JaxB 类,但它仍然没有工作。您是否也可以通过从 XML 生成 JaxB 类来检查并告诉我,我已经厌倦了朋友和同事的所有建议。 @Jayesh 这可以解决。但是请为 xsd 提供已定义(生成)的 processesSalesOrderTypeList,以及为 processesSalesOrderTypeList 生成的 Java 类。根元素需要有适当的命名空间。 【参考方案1】:

我可以想到您的 Unmarshaller 失败的 2 个不同原因。

    查看您的架构,未定义“processedSalesOrderTypeList”。 在您提到的错误中,有效元素是:

<api.supplieroasis.comprocessedSalesOrderMessage>,<api.supplieroasis.comsalesOrderMessage>,<api.supplieroasis.comshipperOfRecordAccountNumber>,<api.supplieroasis.comshippingAccountNumber>,<api.supplieroasis.comuspsMailerId>, <api.supplieroasis.comwarehouseName>

XML 命名空间包含在大括号 中,元素名称紧随其后。这些值在您的 ObjectFactory 中指定。如您所见,由于“processedSalesOrderTypeList”未在您的 ObjectFactory 中定义,因此当 Unmarshaller 在您的 XML 中遇到“processedSalesOrderTypeList”元素时,它知道如何处理它。

    我遇到了一个问题,即从 xjc 生成的代码中的名称空间不匹配,这导致许多元素在反序列化期间返回 null。奇怪的是有些元素会被正确解析,但有些则不会。首先,我将添加一个 ValidationEventHandler 来查看所有 XML 验证错误:

    unmarshaller.setEventHandler(new DefaultValidationEventHandler());

然后,如果您遇到类似于以下错误的错误,此答案应该对您有所帮助。

unexpected element (uri:"", local:"MyEntity")

我会寻找具有此字段的类(它可能是根级类)。在查找此类时使用判断,如果它无法解析的元素标记是根元素,那么该类很可能与该元素具有相同的确切名称。如果该元素是另一个元素的子元素,请在相应的类中查找该特定元素。

找到类后,请查看名称空间是否正确匹配。我遇到了一个问题,命名空间是空白的,需要填写。

使用与 XML 相同的命名空间填充命名空间。代码示例:

<test:MyEntity xmlns:test="com.example">
...
</test:MyEntity>

@XmlElement(name = "MyEntity", namespace = "test:com.example")

本质上,确保注解中的命名空间和 XML 匹配,如果不匹配并且启用命名空间验证,它将拒绝解组 XML。

如果这不能解决您的问题并且您看到有关 ObjectFactory 的异常,我会查找与此特定元素对应的 QName。正确的 sn-p 代码应该是这样的,确保命名空间匹配(如果不存在则创建它):

QName _MyEntity_QNAME = new QName("test:com.example", "MyEntity");

在同一个 ObjectFactory 中,查找 @XmlElementDecl。这是定义如何将 XML 元素转换为 Java 对象的注释。正确的代码应该是这样的:

@XmlElementDecl(namespace = "test:com.example", name = "MyEntity")
public JAXBElement<MyEntity> createMyEntity(MyEntity value) 
    return new JAXBElement<MyEntity>(_MyEntity_QNAME, MyEntity.class, null, value);

命名空间全部匹配后,反序列化就可以工作了。如果没有,请返回并检查异常并将其发布,我将提供更多见解。

【讨论】:

【参考方案2】:

您的 JAXB 对象工厂和 XSD 似乎不同..再次尝试重新创建 JAXB 类。

【讨论】:

你能帮帮我吗,我尝试使用所有组合创建 Jaxb,但没有成功。 我也有同样的问题;当从 xsd 创建类时,根元素似乎被忽略了......我想知道修复它的正确方法是什么? @IntelliData 您需要提供您正在尝试序列化和反序列化的 JAXB 类 @Ravi 我想提供它;你认为我应该打开一个新帖子,还是应该编辑这个,然后添加代码? @IntelliData 不要依赖别人,你需要不断尝试和积极主动。发布问题不会得到解决方案,您需要快速回复并了解您所缺少的内容【参考方案3】:

您的 XSD 与 XML 不匹配。但是您可以从 XML 创建新的 XSD。我使用 trang 实用程序。最好提供多个 XML 来生成所有元素。

我将你的 XML 保存到 1.xml,运行:

trang 1.xml 1.xsd

download link

然后您可以使用 openjdk 原生实用程序创建 java 类

xjc -d /tmp/zzz 1.xsd

您的课程将出现在 /tmp/zzz 中

【讨论】:

【参考方案4】:

尝试使用此 XSD 生成 Java 类,这应该可以,我尝试并能够解组您发送的 xml

<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="api.example.com" xmlns:ns2="api.example.com">
      <xs:element name="processedSalesOrderTypeList">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:totalCount"/>
            <xs:element ref="ns2:list"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="totalCount" type="xs:integer"/>
      <xs:element name="list">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:salesChannelOrderNumber"/>
            <xs:element ref="ns2:salesChannelName"/>
            <xs:element ref="ns2:orderDate"/>
            <xs:element ref="ns2:sofsCreatedDate"/>
            <xs:element ref="ns2:warehouseName"/>
            <xs:element ref="ns2:shipToAddress"/>
            <xs:element ref="ns2:returnAddress"/>
            <xs:element ref="ns2:shippingSpecifications"/>
            <xs:element ref="ns2:branding"/>
            <xs:element ref="ns2:orderFulfillment"/>
            <xs:element ref="ns2:orderId"/>
            <xs:element ref="ns2:status"/>
            <xs:element ref="ns2:retailChannelCode"/>
            <xs:element ref="ns2:retailerOrderCode"/>
            <xs:element ref="ns2:retailOrderNumber"/>
            <xs:element ref="ns2:actionRequired"/>
            <xs:element ref="ns2:processedSalesOrderLine"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="salesChannelOrderNumber" type="xs:NMTOKEN"/>
      <xs:element name="salesChannelName" type="xs:NCName"/>
      <xs:element name="orderDate" type="xs:NMTOKEN"/>
      <xs:element name="sofsCreatedDate" type="xs:NMTOKEN"/>
      <xs:element name="warehouseName" type="ns2:code"/>
      <xs:element name="shipToAddress">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:contactName"/>
            <xs:element ref="ns2:address1"/>
            <xs:element ref="ns2:city"/>
            <xs:element ref="ns2:stateOrProvince"/>
            <xs:element ref="ns2:postalCode"/>
            <xs:element ref="ns2:countryCode"/>
            <xs:element ref="ns2:phone"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="returnAddress">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:contactName"/>
            <xs:element ref="ns2:address1"/>
            <xs:element ref="ns2:city"/>
            <xs:element ref="ns2:stateOrProvince"/>
            <xs:element ref="ns2:postalCode"/>
            <xs:element ref="ns2:countryCode"/>
            <xs:element ref="ns2:phone"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="shippingSpecifications">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:isThirdPartyBilling"/>
            <xs:element ref="ns2:isSignatureRequired"/>
            <xs:element ref="ns2:isDeclaredValueRequired"/>
            <xs:element ref="ns2:smallParcelShipment"/>
            <xs:element ref="ns2:isExport"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="isThirdPartyBilling" type="xs:boolean"/>
      <xs:element name="isSignatureRequired" type="xs:boolean"/>
      <xs:element name="isDeclaredValueRequired" type="xs:boolean"/>
      <xs:element name="smallParcelShipment">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:shippingServiceLevel"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="shippingServiceLevel" type="ns2:code"/>
      <xs:element name="isExport" type="xs:boolean"/>
      <xs:element name="branding">
        <xs:complexType/>
      </xs:element>
      <xs:element name="orderFulfillment" type="xs:NCName"/>
      <xs:element name="orderId" type="xs:integer"/>
      <xs:element name="status" type="xs:NCName"/>
      <xs:element name="retailChannelCode" type="xs:NCName"/>
      <xs:element name="retailerOrderCode" type="xs:NCName"/>
      <xs:element name="retailOrderNumber" type="xs:integer"/>
      <xs:element name="actionRequired" type="xs:boolean"/>
      <xs:element name="processedSalesOrderLine">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="ns2:salesChannelLineId"/>
            <xs:element ref="ns2:salesChannelLineNumber"/>
            <xs:element ref="ns2:partnerSKU"/>
            <xs:element ref="ns2:barcode"/>
            <xs:element ref="ns2:salesChannelSKU"/>
            <xs:element ref="ns2:quantity"/>
            <xs:element ref="ns2:itemPrice"/>
            <xs:element ref="ns2:lineId"/>
            <xs:element ref="ns2:itemId"/>
            <xs:element ref="ns2:itemName"/>
            <xs:element ref="ns2:lineStatus"/>
            <xs:element ref="ns2:unitCost"/>
            <xs:element ref="ns2:unitCostCurrencyCode"/>
            <xs:element ref="ns2:firstCost"/>
            <xs:element ref="ns2:firstCostCurrencyCode"/>
            <xs:element ref="ns2:additionalShippingCost"/>
            <xs:element ref="ns2:additionalShippingCostCurrencyCode"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="salesChannelLineId" type="xs:integer"/>
      <xs:element name="salesChannelLineNumber" type="xs:integer"/>
      <xs:element name="partnerSKU" type="xs:NCName"/>
      <xs:element name="barcode" type="xs:NCName"/>
      <xs:element name="salesChannelSKU" type="xs:NCName"/>
      <xs:element name="quantity" type="xs:integer"/>
      <xs:element name="itemPrice" type="xs:decimal"/>
      <xs:element name="lineId" type="xs:integer"/>
      <xs:element name="itemId" type="xs:integer"/>
      <xs:element name="itemName" type="xs:string"/>
      <xs:element name="lineStatus" type="xs:NCName"/>
      <xs:element name="unitCost" type="xs:decimal"/>
      <xs:element name="unitCostCurrencyCode" type="xs:NCName"/>
      <xs:element name="firstCost" type="xs:decimal"/>
      <xs:element name="firstCostCurrencyCode" type="xs:NCName"/>
      <xs:element name="additionalShippingCost" type="xs:decimal"/>
      <xs:element name="additionalShippingCostCurrencyCode" type="xs:NCName"/>
      <xs:complexType name="code">
        <xs:sequence>
          <xs:element ref="ns2:code"/>
        </xs:sequence>
      </xs:complexType>
      <xs:element name="code" type="xs:string"/>
      <xs:element name="contactName" type="xs:string"/>
      <xs:element name="address1" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="stateOrProvince" type="xs:NCName"/>
      <xs:element name="postalCode" type="xs:integer"/>
      <xs:element name="countryCode" type="xs:NCName"/>
      <xs:element name="phone" type="xs:NMTOKEN"/>
    </xs:schema>

【讨论】:

以上是关于Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是的主要内容,如果未能解决你的问题,请参考以下文章

jaxb unmarshal xml元素到一些字段的对象

Unmarshal NullPointerException(带有 JAXB 参考实现)

JAXB Unmarshal 创建一个空对象

使用 JAXB 和 Unmarshal 过早结束文件。响应中的 xml 对我来说似乎有效

Java Jaxb:意外元素(uri:“”,本地:“创建”)。预期元素是 <Create>

将Java从1.8.0_45更新为1.8.0_131后,JAXB unmarshal字段为空