PHP SoapClient: ορίσετε ένα namespace χωρίς πρόθεμα

ψήφοι
0

Είμαι καταναλώνουν μια υπηρεσία WSDL SOAP, χρησιμοποιώντας SoapClient της PHP. Το παραγόμενο XML περιέχει τους ακόλουθους ορισμούς ονομάτων:

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

Και τα στοιχεία από αυτό το ns1namespace όλα πρόθεμα ns1:elementName.

Ο πάροχος υπηρεσιών λέει ότι αυτό είναι λάθος και θέλουν αυτά τα στοιχεία χωρίς το πρόθεμα, αν και η WSDL ορίζει την υποχρέωση για την: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Μια λύση είναι να κάνετε τα εξής πριν από την αποστολή του XML: $xml = str_replace(':ns1', '', $xml);. Αυτό λειτουργεί, αλλά είναι σαφώς ένα σιδηροπρίονο, και δεν είμαι οπαδός του αμυχές.

Είναι ένας τρόπος για να πει εκεί SoapClientγια να χειριστεί ένα συγκεκριμένο πεδίο ονομάτων ως προεπιλεγμένο / δεν το πρόθεμα; Αυτό που θα ήθελα να επιτύχουμε είναι <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>πριν από τη δημιουργία το υπόλοιπο του φακέλου, η οποία, θεωρητικά, βεβαιωθείτε ότι όλα τα στοιχεία από εκείνη την περιοχή είναι επίσης χωρίς πρόθεμα. Αυτό θα φαίνεται σαν η σωστή και έγκυρη λύση για μένα.

Δημοσιεύθηκε 24/10/2019 στις 11:57
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

WebApplicationImportΔεν είναι ένα έγκυρο URI . Έτσι δεν είναι έγκυρη ονομάτων. Έτσι, το WSDL και XML που είναι στην πραγματικότητα άκυρη. κάποια μονάδα ανάλυσης μπορεί να ανεχθεί ονομάτων, όπως αυτό, αλλά θα πρέπει να είναι κάτι σαν urn:WebApplicationImportή http://example.com/ns/WebApplicationImport.

Με την αφαίρεση του προθέματος βάζετε τα στοιχεία στο τρέχον προεπιλεγμένο χώρο ονομάτων και αυτό θα πρέπει να είναι το κενό / μη namespace σε σας περίπτωση.

Ενδιαφέρουσες αρκετά PHP DOM ανέχεται σε ορισμούς ονομάτων για τα προθέματα, αλλά όχι για τον προεπιλεγμένο χώρο ονομάτων:

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

Παραγωγή:

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

Έτσι, ανάλογα με το πρόγραμμα ανάλυσης χρησιμοποιεί ο πάροχος υπηρεσιών θα μπορούσε να ρίξει τα λάθη για την WebApplicationImportως χώρο ονομάτων URI.

Θα πρέπει να αφαιρέσετε / καθορίσει το χώρο ονομάτων στο WSDL. Αν το διορθώσετε, στη συνέχεια, ο πάροχος υπηρεσιών οφείλει να προσαρμόσει τη λογική του να χρησιμοποιήσει το νέο χώρο ονομάτων.

Προθέματα είναι μόνο ψευδώνυμα για την πραγματική χώρο ονομάτων URI. Οι παρακάτω 3 παραδείγματα μπορούν όλα να διαβαστεί ως {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Απαντήθηκε 25/10/2019 στις 14:30
πηγή χρήστη

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