我在通过亚马逊MWS向亚马逊提交订单确认时遇到了一些麻烦。
我提交的XML是:
<?xml version="1.0"?>
<AmazonEnvelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>F85S4E7G4FSE98</MerchantIdentifier>
</Header>
<MessageType>OrderAcknowledgment</MessageType>
<Message>
<MessageID>1</MessageID>
<OrderAcknowledgment>
<AmazonOrderID>654-8547853-2598634</AmazonOrderID>
<MerchantOrderID>658795124</MerchantOrderID>
<StatusCode>Success</StatusCode>
<Item>
<AmazonOrderItemCode>35287489587654</AmazonOrderItemCode>
<MerchantOrderItemID>587487</MerchantOrderItemID>
<AmazonOrderItemCode>35287489587655</AmazonOrderItemCode>
<MerchantOrderItemID>587488</MerchantOrderItemID>
</Item>
</OrderAcknowledgment>
</Message>
</AmazonEnvelope>
在提交XML时,亚马逊返回的错误是:
错误25:我们无法处理XML Feed,因为一个或多个项目无效。请重新提交Feed。
我已按照亚马逊提供的Guide to XML documentation创建了XML。
基于this Stack Overflow question,多个项目的格式正确无误。
我已根据XSD文件检查了我的数据,XML似乎有效
https://images-na.ssl-images-amazon.com/images/G/01/rainier/help/xsd/release_1_9/OrderAcknowledgement.xsd
https://images-na.ssl-images-amazon.com/images/G/01/rainier/help/xsd/release_1_9/amzn-base.xsd
我尝试使用XML XSD验证程序验证XML,但它返回错误:
Src-resolve:无法将名称'AmazonOrderID'解析为A(n)'元素声明'组件。
这个错误对我来说没有多大意义,但我相信它是由于其他XSC的大量内容而被返回,我无法在验证器中正确引用。 'AmazonOrderID'的限制位于amzn-base.xsd文件中,并与我提供的AmazonOrderID匹配
<xsd:element name="AmazonOrderID">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\w{3}-\w{7}-\w{7}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
我已经尝试确认订单中的单个项目,因为多个项目的结构不正确
我尝试完全删除项目部分,因为我有时不需要阅读项目部分
我尝试通过我创建的php脚本提交,成功处理所有其他请求
我尝试通过亚马逊暂存器提交:https://mws.amazonservices.co.uk/scratchpad/index.html
我所尝试过的任何事情都没有解决这个问题,我完全没有想法
我们将非常感谢您提供的任何帮助
谢谢
答案 0 :(得分:4)
我目前正试图获得所有必要的XSD以实际验证MWS文件,但到目前为止运气不佳。如果缺少单个XSD,大多数验证器都会阻塞,即使其内容与当前正在验证的文件无关。亚马逊肯定确实难以真正验证东西 - 除非我遗漏了一些明显的东西。
我的临时解决方案是使用“残缺的”XSD,它只链接到我实际拥有的副本的其他XSD。使用这个文件并不完美,但总比没有好。这些XSD嵌套的方式,我可以用我的XSD验证的任何内容实际上都是有效的。唯一的缺点是存在我无法验证的有效XML,我不得不忍受。
使用这组XSD,我必须对XML进行以下更改才能通过验证:
(我开始在CM Serperg-McQueen的印象中写下这个答案,让拼写混淆了......我只是再读一遍,结果发现,他是现场,我应该提高我的阅读能力技能)
有关AmazonOrderID的验证器消息具有误导性。这很可能是因为验证器也缺少部分XSD。
只是为了完整起见。该文件通过了(残缺的)验证:
<?xml version="1.0"?>
<AmazonEnvelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>F85S4E7G4FSE98</MerchantIdentifier>
</Header>
<MessageType>OrderAcknowledgement</MessageType>
<Message>
<MessageID>1</MessageID>
<OrderAcknowledgement>
<AmazonOrderID>654-8547853-2598634</AmazonOrderID>
<MerchantOrderID>658795124</MerchantOrderID>
<StatusCode>Success</StatusCode>
<Item>
<AmazonOrderItemCode>35287489587654</AmazonOrderItemCode>
<MerchantOrderItemID>587487</MerchantOrderItemID>
</Item>
<Item>
<AmazonOrderItemCode>35287489587655</AmazonOrderItemCode>
<MerchantOrderItemID>587488</MerchantOrderItemID>
</Item>
</OrderAcknowledgement>
</Message>
</AmazonEnvelope>
答案 1 :(得分:2)
你说“我已经根据XSD文件检查了我的数据并且XML似乎有效”,但是你提到的架构文档都没有声明你最外面的元素(也没有其他一些,但我不会打扰列表)。亚马逊告诉你的是,事实上,XML并不是有效的。
然后,您的任务是使用XSD验证程序来确定您提交的文档中的内容无效。为了实现这一目的,您需要将验证器指向Amazon验证器正在使用的架构文档或其副本 - 如果您使用的验证器无法找到所有必要的声明(如其错误消息所述)那么它不太可能对你有所帮助。
对于它的价值,我尝试使用您提到的文档(https://images-na.ssl-images-amazon.com/images/G/01/rainier/help/xsd/release_1_9/amzn-envelope.xsd)引用的模式文档来验证您的数据,但是文档Amazon.xsd和MaterialHandling.xsd(由Product包含在其中)。 xsd)似乎不是相对引用所暗示的。因此,可能需要更多的功课来整合亚马逊模式文档中的工作模式,而不是预期的工作模式。
据我所知,XML文档的直接问题是:
您的Item元素有多个订单商品代码而不只是一个;我认为你的意思是
<Item>
<AmazonOrderItemCode>35287489587654</AmazonOrderItemCode>
<MerchantOrderItemID>587487</MerchantOrderItemID>
</Item>
<Item>
<AmazonOrderItemCode>35287489587655</AmazonOrderItemCode>
<MerchantOrderItemID>587488</MerchantOrderItemID>
</Item>