PHP SoapClient: stel een namespace zonder voorvoegsel

stemmen
0

Ik ben het nuttigen van een WSDL SOAP service met behulp van PHP SoapClient. De gegenereerde XML bevat de volgende naamruimtedefinities:

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

En de elementen uit deze ns1namespace zijn allemaal voorafgegaan door ns1:elementName.

De dienstverlener zegt dat dit verkeerd is en ze willen deze elementen zonder het voorvoegsel, hoewel de WSDL definieert een vereiste voor deze: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Een oplossing is om het volgende te doen voordat u de XML: $xml = str_replace(':ns1', '', $xml);. Dit werkt, maar is duidelijk een hack, en ik ben geen fan van hacks.

Is er een manier om te vertellen SoapClientaan een specifieke namespace te behandelen als de standaard / niet voorvoegsel het? Wat ik wil bereiken is <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>voor het genereren van de rest van het omhulsel, hetgeen in theorie waarborgen dat alle elementen uit die naamruimte ook unprefixed. Dit lijkt net als de juiste en geldige oplossing voor mij.

De vraag is gesteld op 24/10/2019 om 11:57
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

WebApplicationImportis geen geldige URI . Het is dus geen geldige namespace. Dus de WSDL en u XML is eigenlijk ongeldig. sommige parser zou tolereren naamruimten als dat maar het moet iets zijn als urn:WebApplicationImportof http://example.com/ns/WebApplicationImport.

Door het verwijderen van het voorvoegsel zet je de elementen in de huidige standaard namespace en dit moet de lege / niet namespace in jou geval.

Interessant genoeg PHP DOM tolereert in naamruimtedefinities voor voorvoegsels, maar niet voor de standaard namespace:

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

Output:

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

Dus afhankelijk van de parser de dienstverlener gebruikt deze fouten zou kunnen gooien voor WebApplicationImportals een namespace URI.

Je moet verwijderen / fix de namespace in de WSDL. Als je het vervolgens vast te stellen de dienstverlener moet zijn logica om de nieuwe namespace gebruiken aan te passen.

Voorvoegsels zijn alleen aliassen voor de werkelijke namespace URI. De volgende 3 voorbeelden kunnen allemaal worden gelezen als {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
antwoordde op 25/10/2019 om 14:30
bron van user

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