PHP SoapClient: définir un espace de noms sans préfixe

voix
0

Je consomme un service SOAP WSDL à l'aide de PHP SoapClient. Le XML généré contient les définitions d'espaces de noms suivants:

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

Et les éléments de cet ns1espace de noms sont toutes préfixées avec ns1:elementName.

Le fournisseur de services dit que cela est faux , et ils veulent que ces éléments sans le préfixe, même si le WSDL définit une exigence pour elle: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Une solution consiste à effectuer les opérations suivantes avant d' envoyer le XML: $xml = str_replace(':ns1', '', $xml);. Cela fonctionne, mais est clairement un hack, et je ne suis pas fan de hacks.

Est - il possible de dire SoapClientà gérer un espace de noms spécifique par défaut / ne préfixe pas? Ce que je voudrais obtenir est <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>avant de générer le reste de l'enveloppe, qui, en théorie, faire en sorte que tous les éléments de cet espace de noms sont également sans préfixe. Cela semble être la solution appropriée et valable pour moi.

Créé 24/10/2019 à 11:57
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

WebApplicationImportn'est pas valide URI . Il est donc pas un espace de noms valide. Ainsi , le WSDL et XML vous est en fait invalide. certains analyseur peut tolérer namespaces comme ça , mais il devrait être quelque chose comme urn:WebApplicationImportou http://example.com/ns/WebApplicationImport.

En supprimant le préfixe que vous mettez les éléments dans l'espace de noms par défaut en cours et cela devrait être l'espace de noms vide / non en vous cas.

Assez intéressant PHP DOM tolère dans les définitions d'espace de noms pour les préfixes, mais pas pour l'espace de noms par défaut:

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

Sortie:

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

Ainsi , en fonction de l'analyseur le fournisseur de services utilise pourrait générer des erreurs pour WebApplicationImportun URI d' espace.

Vous devez supprimer / fixer l'espace de noms dans le WSDL. Si vous le réparer alors le fournisseur de services doit adapter sa logique d'utiliser le nouvel espace de noms.

Alias sont uniquement Prefixes pour URI d'espace de nom réel. Peuvent tous être lus les 3 exemples suivants {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Créé 25/10/2019 à 14:30
source utilisateur

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