使用PHP的SOAP修改服务器端发送的XML

使用PHP的SOAP修改服务器端发送的XML,php,soap,soapserver,Php,Soap,Soapserver,关于PHP的SoapClient和SoapServer、WSDL模式的问题 比方说,我需要创建XML某个部分的摘要,其中包含数据。使用SoapClient很容易。我重载SoapClient类中的_doRequest方法,对某些元素进行散列,并将其作为其中的元素附加。 然后,我将生成的XML发送到调用parent::\u doRequest的SOAPServer 我需要对响应XML执行同样的操作。在服务器端,我有困难。似乎服务器只能以嵌套数组或对象的形式发送数据,并且以某种方式插入到客户端的响应X

关于PHP的SoapClient和SoapServer、WSDL模式的问题

比方说,我需要创建XML某个部分的摘要,其中包含数据。使用SoapClient很容易。我重载SoapClient类中的_doRequest方法,对某些元素进行散列,并将其作为其中的元素附加。 然后,我将生成的XML发送到调用parent::\u doRequest的SOAPServer

我需要对响应XML执行同样的操作。在服务器端,我有困难。似乎服务器只能以嵌套数组或对象的形式发送数据,并且以某种方式插入到客户端的响应XML中。我尝试用SoapServer的响应发送XML,然后它返回空XML


我真的需要在服务器端解析和修改XML,生成哈希、数字签名等,但到目前为止,我还没有找到答案,无论我在哪里搜索,我都无法找到答案,因此我非常感谢您的帮助。谢谢。

您必须获得一个没有XML声明的XML字符串,并使用SoapVar解析它。 有关详细信息,请参阅

简而言之,就是这样。 您可以根据输入和需要输入的任何其他内容构造一个DOMDocument。XSLT是一种解析和更改XML的好方法。有关如何在php中使用XSLT的简单示例,请参阅上面的链接。 然后从要返回的DOMDocument中选择DOMNode,并将此节点作为参数应用saveXML。这会将所需的XML保存为字符串,而不进行声明。不带参数的Plain saveXML会将根节点保存为包含声明的字符串。 因此:

当然,当您希望返回根元素时,这也起作用:

$result = new SoapVar ($dom -> saveXML($dom -> documentElement), XSD_ANYXML);
return ($result);
加成

我注意到您希望在SOAP头中添加一些内容,而不是在正文中。 这也有点棘手,但它是可以实现的-我希望下面的内容能够满足您的需要

首先,添加标头详细信息只能在函数脚本中完成,然后函数必须将服务器变量声明为全局变量,以便引用声明函数之外的全局变量,如下所示:

<?php   
    class mySOAPclass {
        function xxx ($arg) {
            global $server;

            // your code for the header part
            // example
            $auth = array();
            $auth['UserName'] = 'user';
            $auth['Password'] = 'pw';
            $header = new SoapVar ($auth, SOAP_ENC_OBJECT);
            // end example

            $header = new SoapHeader ('http://schemas.xmlsoap.org/soap/header/', 'credentials', $header, false);
            $server -> addSoapHeader ($header);

            // your code for the body part, assuming it results in a DOM $dom

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

            return ($result);
        }

    ini_set( "soap.wsdl_cache_enabled", "0");
    $server = new SoapServer ("yourOwn.wsdl");
    $server -> setClass ('mySOAPclass');
    $server -> setObject (new mySOAPclass());
    $server -> handle();
?>

我也想知道同样的情况。看到我的问题了吗http://stackoverflow.com/questions/12692797/how-do-i-catch-data-from-the-xml-content-of-a-soap-request-in-a-php-soapserver 我问如何从输入XML中获取数据,输入XML似乎是在stdClass对象上强制转换的,当然也会返回一些XML,可能是输入XML,但修改如你所愿-但我找不到任何有用的在这方面的任何地方。我希望你的问题得到回答!我取得了一些进展。从输入中获取数据首先要使用文件\u get\u contents'php://input'见http://stackoverflow.com/questions/10835336/parsing-soap-response-via-wsdl-soapserver/1095590710955907. 但我仍然无法按照我的意愿创建返回XML—我得到了一些标准返回值,这些值似乎是由soapServer生成的,使用WSDL中的DEF,但奇怪的是,没有返回消息中指定的顶层,而是名称等于输入1+响应。当我发现如何做到这一点时,我会告诉你的。@Maestro13是的,谢谢-我用这个问题来帮助我解析客户端的XML,但仍然不知道如何在服务器端创建和修改XML。我想我们可以解决这两个问题,让我们讨论一下,只需将您的任何联系信息通过电子邮件发送到gmail.com上的supervodka,谢谢:SoapVar类的对象无法转换为字符串
<?php   
    class mySOAPclass {
        function xxx ($arg) {
            global $server;

            // your code for the header part
            // example
            $auth = array();
            $auth['UserName'] = 'user';
            $auth['Password'] = 'pw';
            $header = new SoapVar ($auth, SOAP_ENC_OBJECT);
            // end example

            $header = new SoapHeader ('http://schemas.xmlsoap.org/soap/header/', 'credentials', $header, false);
            $server -> addSoapHeader ($header);

            // your code for the body part, assuming it results in a DOM $dom

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

            return ($result);
        }

    ini_set( "soap.wsdl_cache_enabled", "0");
    $server = new SoapServer ("yourOwn.wsdl");
    $server -> setClass ('mySOAPclass');
    $server -> setObject (new mySOAPclass());
    $server -> handle();
?>
<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://schemas.xmlsoap.org/soap/header/">
    <SOAP-ENV:Header>
        <ns1:credentials>
            <UserName>user</UserName>
            <Password>pw</Password>
        </ns1:credentials>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        ...
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>