-3

amzn -envelope.xsdを使用して Amazon XML フィード リクエストを検証しようとしていますが、スキーマに問題があります。

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 仕様の暗い場所の 1 つに遭遇しました。 その仕様の v1.0 のセクション 4.2.1 には、注記があります。

注: 上記は、同じスキーマ ドキュメントの複数の ing が Schema Properties Correct (§3.15.6) の第 2 節の違反を構成しないように慎重に表現されていますが、アプリケーションは同じスキーマ ドキュメントの ing<include>を回避することが許可され、実際に推奨されます。<include>コンポーネントごとにアイデンティティを確立する必要性を未然に防ぐために、複数回。

これにより、(a) スキーマ バリデータが 2 回目のインクルードを確認したときに既に amz-base.xsd がインクルードされていることを認識し (他の複数インクルードされたスキーマ ドキュメントについても同様)、動作を続行することは適合動作であることが明確に確立されます。 -- おそらく Amazon がそのスキーマをテストするために使用したプロセッサがこれを行った -- しかし、(b) この動作は「許可され、実際に奨励され」ており、(推測することしかできない) 必須ではない. つまり、プロセッサの動作が不適合であることを示すことは不可能だと思います。

適切な回避策がわかりません。問題のすべてのスキーマ ドキュメントのローカル コピーを作成し、最上位の amzn-envelope.xsd を除くすべての内容をコメント アウトすることによって、スキーマ用に独自のスキーマ ドキュメントを作成することは、適切でない回避策の 1 つです。 ssl-images-amazon.com でスキーマ ドキュメントのコピーを拒否するプロセッサを使用する場合は、そのローカル コピーを使用します。幸運を。

この場合、スキーマ プロセッサの動作を変更する方法があるかどうか、ベンダーに問い合わせてみてください。

于 2013-06-25T15:00:30.510 に答える