-3

我正在尝试使用amzn-envelope.xsd验证 Amazon XML Feed 请求,但遇到了架构问题,因为 amzn-envelope.xsd 通过包含的架构包含对amzn-base.xsd 的多个引用。

这是我的示例 XML 提要:

<AmazonEnvelope 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>A38Z13EKY7MB4Y</MerchantIdentifier>
</Header>
<MessageType>OrderFulfillment</MessageType>
<Message>
    <MessageID>1</MessageID>
    <OrderFulfillment>
        <AmazonOrderID></AmazonOrderID>
        <MerchantFulfillmentID>2148031177</MerchantFulfillmentID>
        <FulfillmentDate>2013-06-25T09:54:22Z</FulfillmentDate>
        <FulfillmentData>
            <CarrierName>UKMail Business Class</CarrierName>
            <ShippingMethod>CU - Next Day</ShippingMethod>
            <ShipperTrackingNumber>30995140015293</ShipperTrackingNumber>
        </FulfillmentData>
    </OrderFulfillment>
</Message>
</AmazonEnvelope>

使用如下代码进行验证时:

SchemaAmazonEnvelopeURL = "https://images-na.ssl-images-amazon.com/images/G/01/rainier/help/xsd/release_1_9/amzn-envelope.xsd";
XDocument xdoc = XDocument.Parse(xml_data);
bool success = false;
try 
{
    success = Validate(xdoc, SchemaAmazonEnvelopeURL);
} 
catch (Exception ex)
{
    log.Error("Failed to validate against AWS Schema\n\n" + ex.Message);
}

Assert.IsTrue(success, "Failed validation");
public bool Validate(XDocument xDocument, string xsdSchema)
{
    bool success = true;
    XmlSchemaSet schemas = new XmlSchemaSet();
    schemas.Add("", xsdSchema);

    // Validate
    xDocument.Validate(schemas, (o, e) =>
    {
        throw e.Exception;
    });

    return success;
}

我收到以下错误:

complexType 'NoiseLevelDimension' 已被声明。

通过查看架构,我可以看到amzn-base.xsd通过其他包含的架构多次包含,这就是验证失败的原因。

我怎样才能解决这个问题?

4

1 回答 1

2

[我已经编辑了问题以删除架构中存在循环引用的说法;模式文档的检查表明没有循环引用,只有同一模式文档的多次包含。]

您遇到了 XSD 规范中的一个黑暗领域。 该规范 v1.0 的第 4.2.1 节有一个注释阅读

注意:以上内容措辞谨慎,因此<include>同一模式文档的多个 ing 不会构成违反 Schema Properties Correct (§3.15.6) 的第 2 条,但允许,实际上鼓励应用程序,以避免<include>ing 相同的模式文档不止一次地阻止了逐个组件建立身份的必要性。

这非常清楚地确定(a)当它看到第二个包含(对于其他多重包含的模式文档也是如此)并继续时,您的模式验证器注意到它已经包含 amz-base.xsd 将是符合行为——大概是亚马逊用来测试其模式的处理器做到了这一点——而且(b)这种行为是“允许的,确实是鼓励的”,并且(只能推断)不是必需的。也就是说,我认为不可能证明您的处理器的行为是不合格的。

我不知道一个好的解决方法;一种不好的解决方法是为架构创建自己的架构文档,方法是制作所有相关架构文档的本地副本并注释掉除顶级 amzn-envelope.xsd 之外的所有内容,并在与拒绝 ssl-images-amazon.com 上的模式文档副本的处理器合作时使用该本地副本。祝你好运。

在这种情况下,您可以尝试询问您的供应商是否有办法改变模式处理器的行为。

于 2013-06-25T15:00:30.510 回答