Xml 验证SOAP消息

Xml 验证SOAP消息,xml,soap,validation,Xml,Soap,Validation,我无法将任何SOAP消息验证为有效的XML。例如,我从维基百科上截取了下面的SOAP消息,但失败了。 验证器是错误的还是SOAP文件中有错误? 如果验证器是错误的,你能建议另一个吗?它应该考虑模式。例如,W3C说这是格式良好的,但正如Validome正确指出的那样,它实际上是非常无效的 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://s

我无法将任何SOAP消息验证为有效的XML。例如,我从维基百科上截取了下面的SOAP消息,但失败了。 验证器是错误的还是SOAP文件中有错误? 如果验证器是错误的,你能建议另一个吗?它应该考虑模式。例如,W3C说这是格式良好的,但正如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>

http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
http://localhost:8080/axis2/services/MyService
ECE5B3F187F29D28BC11433905662036
分类广告

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

例如,
之后的下一个元素应该是
,我认为它已经被
取代了

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


当你说W3C说它是格式良好的,我不知道你的意思。例如,在元素名
中包含空格以及它们不匹配的事实在任何形式的Xml中都是无效的,更不用说SOAP+XSD了。

您发布的Xml可能完全有效-如果您指定了验证它的模式的位置


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

以下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>

http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
http://localhost:8080/axis2/services/MyService
ECE5B3F187F29D28BC11433905662036
分类广告

要确保SOAP消息的外观与应有的外观完全一致,应根据该消息中引用的所有模式对其进行验证。在您的示例中,这是自定义名称空间(myService)的SOAP、WS-Addressing和模式


SOAP和WS-Addressing的模式可以从也用于名称空间的URL获得,但这只是约定,不是要求。

我模糊地记得,当我使用SOAP时,名称空间导致一些看似有效的SOAP消息无法通过XML验证。这就是我的想法。但我想知道是否有另一种在线替代方案或甚至Java库可以更好地使用。你的答案是,我链接的一个XML文件是一个无效文件的示例,完全忽略了我发布的SOAP示例。罪名成立,感谢John在SOAP中编辑,接下来是一个解决方案,示例中的xmlns不是指定了模式吗?不是。它定义了名称空间的前缀。那么如何更正消息以指定模式位置呢?它会是这样的:不。除此之外,模式位置只是提示。XML的使用者不需要使用它们。其次,您的语法是错误的,它是xsi:schemaLocation=“namespace schemaUrl namespace schemaUrl”或
xsi:noNamespaceSchemaLocation=“schemaUrl schemaUrl”
。Ben,请学习使用小的“0101”工具栏按钮(或Control-K)格式化代码和XML。此外,这只是部分验证,因为SOAP信封模式允许在头中使用随机XML。在开始和结束标记中将“ReplyTo”更改为“ReplyFrom”,并观察发生了什么。