Amazon XML使用具有相同模式文档的多个包含的模式进行验证失败

时间:2013-06-25 12:25:20

标签: c# amazon-web-services xsd xml-validation

有一个奇怪的问题希望有人可以说清楚。我正在尝试使用amzn-envelope.xsd验证Amazon XML Feed请求,但是遇到架构问题,因为amzn-envelope.xsd包含多个对amzn-base.xsd的引用,包括架构。

这是我的示例XML Feed

<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;
}

我收到以下错误;

The complexType 'NoiseLevelDimension' has already been declared.

通过查看模式,我可以看到amzn-base.xsd通过其他包含的模式被多次包含,这就是验证失败的原因,问题是我不知道如何绕过它。

有没有人遇到过类似的东西?

1 个答案:

答案 0 :(得分:2)

[我编辑了这个问题,以删除模式中存在循环引用的声明;对模式文档的检查表明,没有循环引用,只有同一模式文档的多个包含。]

你遇到了XSD规范中的一个黑暗的地方。 Section 4.2.1 of v1.0 of that spec有一个笔记读

  

注意:以上内容经过精心设计,以便多次<include>   相同的架构文档不会构成违反   Schema Properties Correct(§3.15.6)的第2条,但是应用程序   允许,实际上是鼓励,以避免<include>相同   架构文档不止一次地预防了必要性   按组件建立身份组件。

这很清楚地确定了(a)当你看到第二个包含时(同样对于其他乘法包含的模式文档),你的模式验证器会注意到它已经包含了amz-base.xsd。并继续 - 大概是亚马逊用来测试其架构的处理器做到了这一点 - 而且(b)这种行为是“允许的,确实鼓励的”,并且(人们只能推断)不需要。也就是说,我认为不可能证明处理器的行为是不符合要求的。

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

在这种情况下,您可能会尝试询问您的供应商是否有办法更改架构处理器的行为。