Разница между тегами 'ns1' и 'tns' - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь реплицировать устаревшую конечную точку NuSOAP с другой, реализованной с помощью собственной библиотеки SOAP PHP. Я тестирую, возвращая один и тот же фиктивный массив в каждой конечной точке и сравнивая 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 Ответ

2 голосов
/ 28 октября 2019

То, что вы видите здесь, это «пространства имен 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/servicios, либо http://localhost:8000/soap/servicios. Пространство имен должно быть жестко закодировано, чтобы оно было одинаковым при развертывании службы, но для тестирования это не имеет значения.
  • Если вы пишете XML вручную, вы обычно назначаете запоминающиеся префиксыдля каждого пространства имен, например SOAP-ENV или soap или envelope для http://schemas.xmlsoap.org/soap/envelope/, но это не меняет смысла вообще. В этом случае префиксы tns и ns1 - это то, что различные библиотеки SOAP выбрали для использования.

В качестве быстрого примера, эти фрагменты XML будут иметь точно такое же значение:

<?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>

и даже:

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

но это будет означать что-то другое (помните, префикс не имеет значения, только URI):

<?xml version="1.0"?>
<abc:example xmlns:abc="http://something.different.example.com">
     <abc:foo>42</abc:foo>
</abc:example>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...