PHP SoapClient: öneki olmadan bir ad alanını ayarlamak

oy
0

PHP'nin SoapClient kullanarak bir WSDL SOAP hizmeti tüketen ediyorum. Oluşturulan XML aşağıdaki ad tanımları içerir:

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

Ve bundan elemanları ns1ad tüm kodu bulunmaktadır ns1:elementName.

Servis sağlayıcı bu yanlış ve onlar WSDL bunun için bir gereklilik tanımlar rağmen öneki olmadan bu öğeleri istediğiniz söylüyor: xmlns:tns=WebApplicationImport elementFormDefault=qualified.

Bir çözüm XML göndermeden önce aşağıdakileri yapmaktır: $xml = str_replace(':ns1', '', $xml);. Bu çalışır, ancak açıkça kesmek ve ben dalaverecileri bir hayranı değilim.

Anlamanın bir yolu var mı SoapClient, öneki yok / varsayılan olarak belirli bir ad işlemek için? Ne elde etmek istiyorum olduğunu <SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ xmlns=WebApplicationImport>, teorik olarak, bu ad tüm unsurları da öneksiz olmasını sağlayacak zarf, geri kalanını oluşturmadan önce. Bu benim için doğru ve geçerli bir çözüm gibi görünüyor.

Oluştur 24/10/2019 saat 11:57
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

WebApplicationImportBir geçerli değil URI . Bu yüzden geçerli bir ad değil. WSDL Yani ve size XML aslında geçersiz. Bazı ayrıştırıcı böyle ad alanlarını tahammül olabilir ama böyle bir şey olmalı urn:WebApplicationImportveya http://example.com/ns/WebApplicationImport.

önek kaldırarak geçerli varsayılan ad içine unsurları koymak ve bu durumda boş / olmayan ad alanı olmalıdır.

İlginç yeterince PHP DOM önekleri için değil varsayılan ad alanı için ad tanımlarında tahammül:

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

Çıktı:

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

Ayrıştırıcı bağlı Yani servis sağlayıcı bunun için hataları atabilseydin kullanan WebApplicationImportbir isim-alanı tanım olarak.

Sen / kaldırmak WSDL ad çözecektir. Sonra bunu düzeltmek durumunda servis sağlayıcı yeni ad kullanmak için onun mantığını uyum sağlaması gerekmektedir.

Önekleri gerçek ad URI'sındakiyle sadece takma adlardır. Aşağıdaki 3 örnekler bütün olarak okunabilir {urn:example}foo:

  • <foo xmlns="urn:example"/>
  • <ns1:foo xmlns:ns1="urn:example"/>
  • <f:foo xmlns:f="urn:example"/>
Cevap 25/10/2019 saat 14:30
kaynak kullanıcı

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