PHP SoapClient: setați un spațiu de nume fără prefix

voturi
0

Sunt consumatoare de un serviciu WSDL SOAP folosind SoapClient PHP. Fișierul XML generat conține următoarele definiții spațiul de nume:

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

Iar elementele din acest ns1spațiu de nume sunt toate prefixate cu ns1:elementName.

Furnizorul de servicii spune că acest lucru este greșit și ei doresc aceste elemente fără prefixul, chiar dacă WSDL definește o cerință pentru ea: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

O soluție este de a face următoarele înainte de a trimite XML: $xml = str_replace(':ns1', '', $xml);. Aceasta funcționează, dar este în mod clar un hack, iar eu nu sunt un fan al hacks.

Există o modalitate de a spune SoapClientsă se ocupe de un spațiu de nume specific ca implicit / nu - l adăugați prefixul? Ceea ce aș dori să realizeze este <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>înainte de a genera restul pachetului, ceea ce ar, teoretic, să se asigure că toate elementele din acel spațiu de nume sunt , de asemenea , fără prefix. Acest lucru s - ar părea soluția corectă și valabilă pentru mine.

Întrebat 24/10/2019 la 11:57
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

WebApplicationImportnu este valid URI . Deci, nu este un spațiu de nume valid. Deci , WSDL si XML este de fapt nevalid. unii parser s - ar putea tolera namespace de genul asta , dar ar trebui să fie ceva de genul urn:WebApplicationImportsau http://example.com/ns/WebApplicationImport.

Prin eliminarea prefixului ai pus elementele în spațiul de nume implicit curent și acest lucru ar trebui să fie gol non spațiul de nume / în tine caz.

Destul de interesant PHP DOM tolereaza în definiții de spațiu de nume pentru prefixe, dar nu și pentru spațiul de nume implicit:

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

ieşire:

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

Deci , în funcție de parserul furnizorul de servicii utilizează s- ar putea arunca erori pentru WebApplicationImportca un spațiu de nume URI.

Ar trebui să eliminați / repara spațiul de nume în WSDL. Dacă-l repara, atunci furnizorul de servicii trebuie să se adapteze logica sa de a utiliza noul spațiu de nume.

Prefixele sunt doar pseudonime pentru spațiul de nume real URI. Următoarele 3 exemple pot fi toate ca citite {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Publicat 25/10/2019 la 14:30
sursa de către utilizator

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