亚马逊MWS订单确认返回错误25:我们无法处理XML Feed,因为一个或多个项目无效

时间:2013-02-20 10:35:09

标签: xml xsd amazon-mws

我在通过亚马逊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

我所尝试过的任何事情都没有解决这个问题,我完全没有想法
我们将非常感谢您提供的任何帮助

谢谢

2 个答案:

答案 0 :(得分:4)

我目前正试图获得所有必要的XSD以实际验证MWS文件,但到目前为止运气不佳。如果缺少单个XSD,大多数验证器都会阻塞,即使其内容与当前正在验证的文件无关。亚马逊肯定确实难以真正验证东西 - 除非我遗漏了一些明显的东西。

我的临时解决方案是使用“残缺的”XSD,它只链接到我实际拥有的副本的其他XSD。使用这个文件并不完美,但总比没有好。这些XSD嵌套的方式,我可以用我的XSD验证的任何内容实际上都是有效的。唯一的缺点是存在我无法验证的有效XML,我不得不忍受。

使用这组XSD,我必须对XML进行以下更改才能通过验证:

  1. 将MessageType更改为OrderAcknowledgement(在g之后的额外“e”。您是否喜欢拼写可能取决于您居住的池塘的哪一侧,不过XSD命令确切拼写)
  2. 将开始和结束标记更改为OrderAcknowledgement(与上面相同)
  3. 将一个项目拆分为两个(您链接的StackOverflow question有错误)
  4. (我开始在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文档的直接问题是:

  • MessageType的内容拼写为“OrderAcknowledgment”,而不是“OrderAcknowledgement”。
  • MessageType后面的元素名为OrderAcknowledgment;我猜你的意思是OrderAcknowledgement。
  • 您的Item元素有多个订单商品代码而不只是一个;我认为你的意思是

    <Item>
      <AmazonOrderItemCode>35287489587654</AmazonOrderItemCode>
      <MerchantOrderItemID>587487</MerchantOrderItemID>
    </Item>
    <Item>
      <AmazonOrderItemCode>35287489587655</AmazonOrderItemCode>
      <MerchantOrderItemID>587488</MerchantOrderItemID>
    </Item>
    
祝你好运。