मैं एक एसओएपी webservice स्थापित कर रहा हूं जो एक्सएमएल इनपुट लेता है और कस्टम एक्सएमएल आउटपुट वापस करना पड़ता है। यह सब एक डब्लूएसडीएल में परिभाषित किया गया है। मैं इसके लिए साबुन सर्वर लागू करता हूं (जब तक कि कोई कहता है कि इसमें मेरे लक्ष्य को प्राप्त करने से मुझे रोकने वाली बग है :-))।साबुन सर्वर प्रतिक्रिया में कस्टम एक्सएमएल प्रतिक्रिया कैसे वापस आती है?
मैं अभी तक कस्टम एक्सएमएल वापस करने में सक्षम नहीं हूं: मुझे कुछ परिणाम मिलता है जो कि टीएच डब्लूएसडीएल पर आधारित होता है, जिसमें एक मानक रूट तत्व नाम इनपुट एक्सएमएल एक प्लस "रिस्पॉन्स" के बराबर होता है। असल में मुझे आश्चर्य होता है कि एक साइड सवाल के रूप में मुझे आश्चर्य है कि यह क्यों है और क्या यह प्रभावित हो सकता है। बेशक यह एक अच्छी बात है कि डब्लूएसडीएल परिभाषाओं का उपयोग किसी भी तरह किया जाता है जब प्रतिक्रियाएं बनाई जाती हैं, लेकिन जैसा कि मैंने कहा, मुझे नहीं पता कि प्रतिक्रिया में कस्टम एक्सएमएल कैसे प्राप्त करें।
मैं इस रूप में जहाँ तक हो गया है:
डबल्यूएसडीएल
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://pse/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="PSE"
targetNamespace="http://pse/">
<types>
<xs:schema>
<xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
</xs:schema>
</types>
<message name="MI102Req">
<part name="cdhead" type="tns:cdhead_T"/>
<part name="instr" type="tns:instr_T"/>
</message>
<message name="Res">
<part name="cdhead" type="tns:cdhead_T"/>
</message>
<portType name="MIPortType">
<operation name="mi102">
<input message="tns:MI102Req"/>
<output message="tns:Res"/>
</operation>
</portType>
<binding name="MIBinding" type="tns:MIPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="mi102">
<soap:operation soapAction="http://www.testURL/test_soap.php#mi102"/>
<input>
<soap:body use="literal" namespace="http://pse/"/>
</input>
<output>
<soap:body use="literal" namespace="http://pse/"/>
</output>
</operation>
</binding>
<service name="PSE">
<port name="MIPortType" binding="tns:MIBinding">
<soap:address location="http://www.testURL/test_soap.php"/>
</port>
</service>
</definitions>
इनपुट एक्सएमएल
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<mi102 xmlns="http://pse">
<cdhead version="13"/>
<instr/>
</mi102>
</Body>
</Envelope>
वर्तमान php
<?php
class PSE {
function mi102 ($stdClassInput) {
$inp = file_get_contents ('php://input');
$xml = simplexml_load_string ($inp); // Envelope
$ch = $xml -> children();
$elt1 = $ch [0]; // Body
$ch = $elt1 -> children();
$elt2 = $ch [0]; //mi102
$xslt = new XSLTProcessor();
$xslt -> registerPHPFunctions();
$xslt -> importStylesheet (DOMDocument::load ('test.xslt'));
$dom = $xslt -> transformToDoc (DOMDocument::loadXML ($elt2 -> asXML()));
$result = new SoapVar ($dom -> saveXML(), XSD_ANYXML);
return ($result);
}
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer ("test.wsdl");
$server -> setClass ('PSE');
$server -> setObject (new PSE());
$server -> handle();
?>
ऊपर उपयोग XSLT सिर्फ एक एक विशेषता बदल रहा है - और अस्थायी परिवर्तन हमेशा सर्वर द्वारा लौटाए (सिर्फ मामले में :-)) एक
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pse="http://pse">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="pse:mi102">
<mi102Response>
<xsl:apply-templates/>
</mi102Response>
</xsl:template>
<xsl:template match="pse:cdhead">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
<xsl:template match="@version">
<xsl:attribute name="version">14</xsl:attribute>
</xsl:template>
<xsl:template match="*"/>
</xsl:stylesheet>
को रूट नाम मैं वापसी एक्सएमएल
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/">
<SOAP-ENV:Body>
<ns1:mi102Response>
<cdhead version="14"/>
</ns1:mi102Response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
की तरह कुछ होने की उम्मीद लेकिन बजाय इसे
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/">
<SOAP-ENV:Body>
<ns1:mi102Response/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
है
उपरोक्त PHP में $ dom सामग्री को डीबग करने से मैं वास्तव में एक्सएमएल को वापस लौटने की कोशिश करता हूं (एसओएपी लिफाफा/बॉडी में, निश्चित रूप से इनपुट इनपुट की तरह लपेटा जाता है):
<?xml version="1.0" encoding="UTF-8"?>
<mi102Response xmlns:pse="http://pse">
<cdhead xmlns="http://pse" version="14"/>
</mi102Response>
मैं गलत कहां जाऊं? लौटा http प्रतिक्रिया सामग्री में कस्टम एक्सएमएल कैसे प्राप्त करें?