2012-10-04 12 views
7

मैं एक एसओएपी 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 प्रतिक्रिया सामग्री में कस्टम एक्सएमएल कैसे प्राप्त करें?

उत्तर

7

पुhew!

यह मुझे कई रिट्रीज़ और गुगलिंग ले गया जब तक कि मुझे पता चला कि क्या गलत है।
मुझे लगता है कि इसे SoapVar में एक बग के रूप में वर्गीकृत किया जा सकता है।

मुझे पता चला कि जब साबुन एक एक्सएमएल स्ट्रिंग को पार्स करने में पूरी तरह सक्षम है, तो ऐसा नहीं हो सकता है यदि स्ट्रिंग में <?xml version="1.0" encoding="UTF-8"?> जैसे एक्सएमएल घोषणा शामिल है। तो जब आपके पास DOMDocument या SimpleXMLElement है, तो आपको पहले सोपवार द्वारा स्ट्रिंग को पार्स करने से पहले घोषणा को बंद करना होगा।

एक DOMDocument इस के लिए

एक पैरामीटर एक DOMNode चर डोम से ही निर्माण करने के लिए बराबर के साथ saveXML लागू करने के लिए, किसी भी नोड चुनने लेकिन आम तौर पर इस पाठ्यक्रम का रूट नोड हो जाएगा द्वारा किया जा सकता।

$nodes = $dom -> getElementsByTagName ('cdhead'); 
$node = $nodes -> item(0); 

$result = new SoapVar ($dom -> saveXML($node), XSD_ANYXML); 

और अब मेरी परिणाम ठीक है:

अपने सर्वर php में, मैं निम्नलिखित जोड़ा

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pse/"> 
<SOAP-ENV:Header/> 
<SOAP-ENV:Body> 
    <ns1:mi102Response> 
     <cdhead version="14"/> 
    </ns1:mi102Response> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

लौटे एक्सएमएल की जड़ नाम का सवाल है - मुझे यकीन है मैं लूंगा जो कुछ भी मैं चाहता हूं उसे बदलने के लिए एक तरीका ढूंढें (सोपवार द्वारा उत्पन्न मानक mi102Response की बजाय) !!

संबंधित मुद्दे