2013-06-25 83 views
0

有一個奇怪的問題,希望有人能夠闡明一些。我試圖使用amzn-envelope.xsd驗證Amazon XML Feed請求,但是遇到了架構問題,因爲amzn-envelope.xsd通過包含的架構包含對amzn-base.xsd的多個引用。亞馬遜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; 
} 

我碰到下面的錯誤;

 
The complexType 'NoiseLevelDimension' has already been declared. 

通過觀察模式,我可以看到amzn-base.xsd是通過其它包括架構包含不止一次這就是爲什麼驗證失敗,問題是我不知道如何解決它。

有沒有人遇到類似的東西?

回答

2

[我編輯了這個問題來刪除模式中有循環引用的聲明;對模式文檔的檢查表明,沒有循環引用,只有同一模式文檔的多個包含。]

您已經遇到了XSD規範中的其中一個黑暗地方。 Section 4.2.1 of v1.0 of that spec有音讀

注:以上是字斟句酌,以便多個<include>荷蘭國際集團在同一架構文檔的 不會構成違反 條款架構性能的2更正(§3.15.6),但應用程序 被允許,實際上被鼓勵,以避免不止一次地使用相同的 模式文檔來阻止按組件建立身份組件的必要性。

這非常清楚地建立(一),這將是符合行爲的模式驗證注意到它已經包括AMZ-base.xsd,所以當它看到第二包含(以及類似的其他乘法包括模式文檔)並繼續 - 大概亞馬遜用於測試其模式的處理器做到了這一點 - 但也(b)這種行爲被「允許,確實鼓勵」,並且(只能推斷)不是必需的。也就是說,我認爲不可能證明你的處理器的行爲是不合格的。

我不知道一個很好的解決方法;一個不好的解決辦法是爲模式創建自己的模式文檔,方法是製作所有模式文檔的本地副本,並註釋除頂層amzn-envelope.xsd以外的所有內容,並在與拒絕ssl-images-amazon.com上的模式文檔副本的處理器一起使用時使用該本地副本。祝你好運。

在這種情況下,您可以嘗試詢問供應商是否有方法更改模式處理器的行爲。

+0

我很高興,如果它有幫助,但如果你認爲我的答案的底線是這個模式「不應該失敗驗證」,你誤解了它(除非你在技術意義上使用* should * 「這將是一個好主意,但它不是強制性的」)。你面臨的問題是一致性驗證器*沒有義務接受該模式。 –