php – 如何在soapServer响应中返回自定义XML响应?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 如何在soapServer响应中返回自定义XML响应?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4904字,纯文字阅读大概需要8分钟。
内容图文
![php – 如何在soapServer响应中返回自定义XML响应?](/upload/InfoBanner/zyjiaocheng/698/122af2eae9b640229046054969947beb.jpg)
我正在建立一个SOAP Web服务,它接受XML输入并且必须返回自定义XML输出.
所有这些都在WSDL中定义.我为此应用soapServer(直到有人说它有错误阻止我实现我的目标:-)).
我还没有能够返回自定义XML:我得到一些似乎基于WSDL的结果,标准根元素名称等于输入XML加上“响应”.
实际上,这让我感到惊讶,作为一个侧面问题,我想知道为什么会这样,以及它是否可以受到影响.当然,在创建响应时以某种方式使用WSDL定义是一件好事,但正如我所说,我不知道如何在响应中获得自定义XML.
我得到了这个:
WSDL
<?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>
输入XML
<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只是一个更改属性 – 而temp将根名称更改为服务器返回的名称(以防万一:-))
<?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>
我希望返回XML是这样的
<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(当然,包装在SOAP Envelope / Body中,就像输入的那样):
<?xml version="1.0" encoding="UTF-8"?>
<mi102Response xmlns:pse="http://pse">
<cdhead xmlns="http://pse" version="14"/>
</mi102Response>
我哪里出错了?
如何将自定义XML导入返回的http响应内容?
解决方法:
唷!
这花了我几次重试和谷歌搜索,直到我发现了什么是错的.
我认为它可以归类为SoapVar中的一个错误.
我发现尽管SoapVar完全能够解析XML字符串,但如果字符串包含类似<?xml version =“1.0”encoding =“UTF-8”?>的XML声明,则不能这样做.
因此,当您拥有DOMDocument或SimpleXMLElement时,首先必须在SoapVar解析字符串之前剥离声明.
对于DOMDocument,这可以通过应用saveXML来实现,该参数等于从dom本身构造的DOMNode变量,选择任何节点,但通常这将是根节点.
在我的服务器php中,我添加了以下内容:
$nodes = $dom -> getElementsByTagName ('cdhead');
$node = $nodes -> item(0);
$result = new SoapVar ($dom -> saveXML($node), XSD_ANYXML);
现在我的结果还可以:
<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>
至于返回的XML的根名称 – 我相信我会找到一种方法将其更改为我想要的任何内容(而不是SoapVar生成的标准mi102Response)!
内容总结
以上是互联网集市为您收集整理的php – 如何在soapServer响应中返回自定义XML响应?全部内容,希望文章能够帮你解决php – 如何在soapServer响应中返回自定义XML响应?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。