'ns1'和'tns'标签之间的区别

时间:2019-10-28 17:43:38

标签: php soap

我正在尝试将旧的NuSOAP端点复制到另一个使用PHP的本机SOAP库实现的端点。我正在通过在每个端点中返回相同的虚拟数组并比较每个端点返回的xml进行测试。

以下是旧版服务器给出的示例响应

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://localhost/webservices-soap/servicios">
   <SOAP-ENV:Body>
      <ns1:LeerAtributosResponse xmlns:ns1="http://localhost/webservices-soap/servicios">
         <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:ParamValue[2]">.
            <item xsi:type="tns:ParamValue">
               <parametro xsi:type="xsd:string">hola</parametro>
               <valor xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[3]">
                  <item xsi:type="xsd:string">5</item>
                  <item xsi:type="xsd:string">6</item>
                  <item xsi:type="xsd:string">7</item>
               </valor>
            </item>
            <item xsi:type="tns:ParamValue">
               <parametro xsi:type="xsd:string">chau</parametro>
               <valor xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[0]"/>
            </item>
         </return>
      </ns1:LeerAtributosResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是新实现给出的响应:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost:8000/soap/servicios" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>
      <ns1:LeerAtributosResponse>
         <return SOAP-ENC:arrayType="ns1:ParamValue[2]" xsi:type="ns1:ArrayOfParamValue">
            <item xsi:type="ns1:ParamValue">
               <parametro xsi:type="xsd:string">hola</parametro>
               <valor SOAP-ENC:arrayType="xsd:string[3]" xsi:type="ns1:ArrayOfString">
                  <item xsi:type="xsd:string">5</item>
                  <item xsi:type="xsd:string">6</item>
                  <item xsi:type="xsd:string">7</item>
               </valor>
            </item>
            <item xsi:type="ns1:ParamValue">
               <parametro xsi:type="xsd:string">chau</parametro>
               <valor xsi:type="ns1:ArrayOfString"/>
            </item>
         </return>
      </ns1:LeerAtributosResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我发现响应之间存在以下差异:

  • 在节点“ ns1:LeerAtributosResponse”中,有一个额外的标签
  • 在许多字段中,新响应使用“ ns1”前缀,而不是像以前那样使用“ tns”

这两个标签(“ ns1”和“ tns”)之间有什么区别? xml中的这种差异会使响应有所不同吗?

1 个答案:

答案 0 :(得分:2)

您在这里看到的是“ XML命名空间”。简而言之:

  • XML名称空间由URI唯一标识; URI不必指向任何地方,而只是“拥有”名称的一种方式。例如,SOAP信封信息使用命名空间http://schemas.xmlsoap.org/soap/envelope/
  • 在XML文档甚至XML文档的一部分中,名称空间被赋予“本地前缀”,这并不意味着该文档或该部分之外的任何内容,并且只是为了避免多次编写整个URI。 。它们用xmlns:someprefix="http://example.com"之类的属性声明,并在<someprefix:foo someprefix:bar="hello" />之类的元素和属性名中使用
  • 每个部分还具有一个“默认名称空间”,类似于xmlns="http://example.com"声明,它定义了名称空间元素在没有前缀的情况下所处的位置。
  • SOAP服务通常会将其自定义标签放在该服务的特定名称空间中。在这种情况下,该软件将尝试根据运行代码的位置来组成一个名称空间,并提出http://localhost/webservices-soap/servicioshttp://localhost:8000/soap/servicios。命名空间应该确实是硬编码的,因此无论您在何处部署服务,名称空间都应该是相同的,但是对于测试而言,它并不重要。
  • 如果您是手工编写XML,通常会为每个名称空间分配难忘的前缀,例如SOAP-ENV的{​​{1}}或soapenvelope,但这些名称根本没有改变意思。在这种情况下,前缀http://schemas.xmlsoap.org/soap/envelope/tns就是不同的SOAP库选择使用的前缀。

作为一个简单的例子,这些XML片段的含义完全相同:

ns1

和:

<?xml version="1.0"?>
<abc:example xmlns:abc="http://example.com">
     <abc:foo>42</abc:foo>
</abc:example>

甚至:

<?xml version="1.0"?>
<xyz:example xmlns:xyz="http://example.com">
     <xyz:foo>42</xyz:foo>
</xyz:example>

但这意味着不同(记住前缀并不重要,只有URI):

<?xml version="1.0"?>
<abc:example xmlns:abc="http://example.com">
     <xyz:foo xmlns:xyz="http://example.com">42</xyz:foo>
</abc:example>