PHP SoapClient: definir um namespace sem prefixo

votos
0

Eu estou consumindo um serviço WSDL SOAP usando SoapClient do PHP. O XML gerado contém as seguintes definições de namespace:

<SOAP-ENV:Envelope
    xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/
    xmlns:ns1=WebApplicationImport
    ....>

E os elementos deste ns1namespace são prefixados com ns1:elementName.

O prestador de serviços diz que isso é errado e eles querem que esses elementos sem o prefixo, embora o WSDL define um requisito para isso: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Uma solução é fazer o seguinte antes de enviar o XML: $xml = str_replace(':ns1', '', $xml);. Isso funciona, mas é claramente um truque, e eu não sou um fã de hacks.

Existe uma maneira de dizer SoapClientpara lidar com um namespace específico como o default / não prefixo? O que eu gostaria de alcançar é <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>antes de gerar o resto do envelope, o que, em teoria, garantir que todos os elementos de que namespace também são unprefixed. Isto parece como a solução adequada e válida para mim.

Publicado 24/10/2019 em 11:57
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

WebApplicationImportnão é um válido URI . Portanto, não é um espaço de nomes válido. Assim, o WSDL e XML é, na verdade inválido. alguns analisador pode tolerar namespaces como essa, mas deve ser algo como urn:WebApplicationImportou http://example.com/ns/WebApplicationImport.

Ao remover o prefixo de colocar os elementos para o namespace padrão atual e este deve ser o vazio não namespace / em você caso.

bastante interessante PHP DOM tolera em definições de namespace para prefixos, mas não para o namespace padrão:

$document = new DOMDocument();
$document->loadXML(
    '<foo xmlns="WebApplicationImport"/>'
);

Saída:

Notice: DOMDocument::loadXML(): xmlns: URI WebApplicationImport is not absolute in Entity

Então, dependendo do analisador o prestador de serviços utiliza-lo poderia jogar erros de WebApplicationImportcomo um namespace URI.

Você deve remover / fixar o namespace no WSDL. Se você corrigi-lo, em seguida, o prestador de serviços tem de se adaptar a sua lógica para usar o novo namespace.

Prefixos são apenas apelidos para namespace real URI. Os 3 exemplos seguintes podem ser lidas como {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Respondeu 25/10/2019 em 14:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more