有一个奇怪的问题希望有人可以说清楚。我正在尝试使用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通过其他包含的模式被多次包含,这就是验证失败的原因,问题是我不知道如何绕过它。
有没有人遇到过类似的东西?
答案 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上的架构文档副本的处理器时使用该本地副本。祝你好运。
在这种情况下,您可能会尝试询问您的供应商是否有办法更改架构处理器的行为。