【问题标题】:Validating SOAP messages验证 SOAP 消息
【发布时间】:2009-08-03 04:28:20
【问题描述】:

我无法获得任何 SOAP 消息来验证是否为有效 XML。例如,我将下面的 SOAP 消息从 Wikipedia 中取出,但它未能通过 Validome validator。 验证器是错误的还是 SOAP 文件中有错误? 如果验证者错了,你能推荐另一个吗?它应该考虑模式。例如,W3C 说 this xml 格式正确,但正如 Validome 正确指出的那样,它实际上是非常无效的。

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
  <soapenv:Header>
    <wsa:ReplyTo>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
    <wsa:From>
      <wsa:Address>http://localhost:8080/axis2/services/MyService</wsa:Address>
    </wsa:From>
    <wsa:MessageID>ECE5B3F187F29D28BC11433905662036</wsa:MessageID>
  </soapenv:Header>
  <soapenv:Body>
    <req:echo xmlns:req="http://localhost:8080/axis2/services/MyService/">
      <req:category>classifieds</req:category>
    </req:echo>
  </soapenv:Body>
</soapenv:Envelope>

【问题讨论】:

  • 我隐约记得,当我使用 SOAP 时,命名空间会导致一些看似有效的 SOAP 消息无法通过 XML 验证。
  • 这就是我的想法。但我想知道是否有其他在线替代品,甚至是我可以使用的 Java 库,效果会更好。

标签: xml soap validation


【解决方案1】:

您发布的 XML 可能完全有效 - 如果您指定了用于验证它的架构的位置。

XML 术语中的“有效”表示“根据一组 XML 模式有效”。在没有任何模式的情况下,有效性的概念是没有意义的。

【讨论】:

  • 示例中的 xmlns 没有指定架构吗?
  • 没有。这定义了命名空间的前缀。
  • 那么您将如何更正消息以指定架构位置?会不会是这样的: schemas.xmlsoap.org/soap/envelope" soapenv:schemaLocation="schemas.xmlsoap.org/soap/envelope" xmlns:wsa="schemas.xmlsoap.org/ws/2004/08/addressing">
  • 没有。除其他外,模式位置只是提示。 XML 的使用者不需要使用它们。其次,你的语法错了,是xsi:schemaLocation="namespace schemaUrl namespace schemaUrl"或者xsi:noNamespaceSchemaLocation="schemaUrl schemaUrl"。
【解决方案2】:

以下 SOAP 消息验证:

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
  <soapenv:Header>
    <wsa:ReplyTo>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
    <wsa:From>
      <wsa:Address>http://localhost:8080/axis2/services/MyService</wsa:Address>
    </wsa:From>
    <wsa:MessageID>ECE5B3F187F29D28BC11433905662036</wsa:MessageID>
  </soapenv:Header>
  <soapenv:Body>
    <req:echo xmlns:req="http://localhost:8080/axis2/services/MyService/">
      <req:category>classifieds</req:category>
    </req:echo>
  </soapenv:Body>
</soapenv:Envelope>

【讨论】:

  • Ben,请学习使用“0101”工具栏小按钮(或Control-K)来格式化代码和XML。
  • 另外,这只是部分验证,因为 SOAP 信封模式允许在标头中使用随机 XML。在开始和结束标记中将“ReplyTo”更改为“ReplyFrom”,然后观察会发生什么。
【解决方案3】:

我查看了验证器的输出,它工作正常,您使用的 SOAP 消息是错误的。当然,它报告的错误是存在的。此外,如果发现 SOAP 消息存在问题,它会展开到下一个父元素并继续运行,我怀疑验证器没有报告更多错误。

例如,&lt;mod_eeduns/&gt; 之后的下一个元素应该是 &lt;total_obligatedAmount/&gt;(我假设)已被 &lt;total_obligatedAmount_within_this_search/&gt; 取代

如果您必须使用此 SOAP,我建议您创建自己的 XSD,有各种工具可以从现有的 Xml 消息生成它们。此外,联系该站点并传递您发现的问题(使用微妙之处)对他们很有用。如果您不必使用此服务,那就更好了。

当您说 W3C 说它格式正确时,我不确定您的意思。例如,在元素名称 ..&lt;eeParentDuns &gt;&lt;/eeParentDuns&gt;.. 中包含空格以及它们不匹配的事实在任何形式的 Xml 中都是无效的,更不用说 SOAP+XSD。

【讨论】:

  • 您的回答是在谈论我作为无效文件示例链接到的 XML 文件,而完全忽略了我发布的 SOAP 示例。
  • 有罪,感谢 John 在 SOAP 中进行编辑,并感谢其他 SO 的解决方案
【解决方案4】:

为确保 SOAP 消息看起来与它应有的完全一致,您应该根据该消息中引用的所有模式来验证它。在您的示例中,这是自定义命名空间 (myService) 的 SOAP、WS-Addressing 和架构。

SOAP 和 WS-Addressing 的架构可从也用于命名空间的 URL 中获得,但这只是约定,不是要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多