近几天接到一个项目,要用的C#与PHP程序的通信,然后一直在想怎么实现这个功能。后来和朋友们一起讨论说他原来做过一个java和PHP通信的案例,然后就想到PHP与NET肯定也行得通的。当时他就使用的WebServices技术。
然后马上就新建了一个c#的WebServices工程,然后最初写了一个很简单的案例:
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
就返回一个字符串格式的东西。然后去查阅PHP手册找到了soapClient这个函数,参数是WebServices工程的地址,$client=new SoapClient("http://192.168.10.208/HY_SIMS/HY_SIMS.asmx?WSDL");
$h=$client->HelloWorld(); 这样h就接收到WebService中helloworld方法的返回值。 print_r($h);打印$h的结构得到的是这样的一个结构 stdClass Object ( [HelloWorldResult] => Hello World ) 分析这个结构,
foreach ($h as $key=>$val)
{
echo $val;
}
这样就能得到其中 Hello World 这个字符串。
很兴奋 哈,成功了,能够确信接收到.net程序的返回值。
接下来实验接收返回的dataset数组,(因为WebService 只能返回dataset类型)
$result=$client->ds();同样接收过来 print_r($result); 打印格式
stdClass Object ( [dsResult] => stdClass Object ( [schema] => [any] => 1 2 3 ) )
发现格式变了,变成这样的了,和上边字符串的格式有点不一样。然后试着同样用上边的方法解析出来。没成功。
后来偶尔在网上看到这样的格式$videos=$result->getVideoListReturn->videos->contentId
想到自己的这个对象类型也可以这样
$n=$result->dsResult;
将拿到的结果集找到下一层中的另外一个对象
print_r($n);
打印对象的格式
echo "<br />";
foreach ($n as $key=>$val)
{
echo $val;
}
尝试拆分获得结果 成功。
然后思考,如果返回的在深一层,也就是外边在套一个,也可以同样解析出想要的结果。
虽然今天语言组织的不怎样,呵呵,但这是加班好长时间的结果了2个小时,我一直在弄这个东西,就在找到下一层中困扰了一个多小时。其他的其实很简单的。
希望这个能给大家带来帮助。下班吃饭去,然后休息了。
嗯,回来接着写点:
来接着分析怎么得到数据库中的数据,通过以上的分析得出
stdClass Object ( [schema] => [any] => 1yang2long ) 一个这样的类类型的东西,那么我们查看页面源代码发现是一个XML的字符串
stdClass Object
(
[schema] => <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="aa"><xs:complexType><xs:sequence><xs:element name="aid" type="xs:int" minOccurs="0"/><xs:element name="aname" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema>
[any] => <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><aa diffgr:id="aa1" msdata:rowOrder="0"><aid>1</aid><aname>yang</aname></aa><aa diffgr:id="aa2" msdata:rowOrder="1"><aid>2</aid><aname>long</aname></aa></NewDataSet></diffgr:diffgram>
)
,simplexml_load_string();这个方法是PHP中加载XML格式的字符串,我们将上边这段字符串加载$c=$result->dsResult->any;
$xml=simplexml_load_string($c);
var_dump($xml);
然后看看我们得到了什么:查看页面源代码
object(SimpleXMLElement)#4 (1) {
["NewDataSet"]=>
object(SimpleXMLElement)#5 (1) {
["aa"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#6 (2) {
["aid"]=>
string(1) "1"
["aname"]=>
string(4) "yang"
}
[1]=>
object(SimpleXMLElement)#7 (2) {
["aid"]=>
string(1) "2"
["aname"]=>
string(4) "long"
}
}
}
}
很规则的一段代码。然后我去查了手册
$x=$xml->NewDataSet->aa;
foreach($x as $key)
{
echo $key->aid."<br />";
echo $key->aname."<br />";
}
这样就能遍历里边所有节点的数据了。同时我也得到了我想要的数据。
然后马上就新建了一个c#的WebServices工程,然后最初写了一个很简单的案例:
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
就返回一个字符串格式的东西。然后去查阅PHP手册找到了soapClient这个函数,参数是WebServices工程的地址,$client=new SoapClient("http://192.168.10.208/HY_SIMS/HY_SIMS.asmx?WSDL");
$h=$client->HelloWorld(); 这样h就接收到WebService中helloworld方法的返回值。 print_r($h);打印$h的结构得到的是这样的一个结构 stdClass Object ( [HelloWorldResult] => Hello World ) 分析这个结构,
foreach ($h as $key=>$val)
{
echo $val;
}
这样就能得到其中 Hello World 这个字符串。
很兴奋 哈,成功了,能够确信接收到.net程序的返回值。
接下来实验接收返回的dataset数组,(因为WebService 只能返回dataset类型)
$result=$client->ds();同样接收过来 print_r($result); 打印格式
stdClass Object ( [dsResult] => stdClass Object ( [schema] => [any] => 1 2 3 ) )
发现格式变了,变成这样的了,和上边字符串的格式有点不一样。然后试着同样用上边的方法解析出来。没成功。
后来偶尔在网上看到这样的格式$videos=$result->getVideoListReturn->videos->contentId
想到自己的这个对象类型也可以这样
$n=$result->dsResult;
将拿到的结果集找到下一层中的另外一个对象
print_r($n);
打印对象的格式
echo "<br />";
foreach ($n as $key=>$val)
{
echo $val;
}
尝试拆分获得结果 成功。
然后思考,如果返回的在深一层,也就是外边在套一个,也可以同样解析出想要的结果。
虽然今天语言组织的不怎样,呵呵,但这是加班好长时间的结果了2个小时,我一直在弄这个东西,就在找到下一层中困扰了一个多小时。其他的其实很简单的。
希望这个能给大家带来帮助。下班吃饭去,然后休息了。
嗯,回来接着写点:
来接着分析怎么得到数据库中的数据,通过以上的分析得出
stdClass Object ( [schema] => [any] => 1yang2long ) 一个这样的类类型的东西,那么我们查看页面源代码发现是一个XML的字符串
stdClass Object
(
[schema] => <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="aa"><xs:complexType><xs:sequence><xs:element name="aid" type="xs:int" minOccurs="0"/><xs:element name="aname" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema>
[any] => <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><aa diffgr:id="aa1" msdata:rowOrder="0"><aid>1</aid><aname>yang</aname></aa><aa diffgr:id="aa2" msdata:rowOrder="1"><aid>2</aid><aname>long</aname></aa></NewDataSet></diffgr:diffgram>
)
,simplexml_load_string();这个方法是PHP中加载XML格式的字符串,我们将上边这段字符串加载$c=$result->dsResult->any;
$xml=simplexml_load_string($c);
var_dump($xml);
然后看看我们得到了什么:查看页面源代码
object(SimpleXMLElement)#4 (1) {
["NewDataSet"]=>
object(SimpleXMLElement)#5 (1) {
["aa"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#6 (2) {
["aid"]=>
string(1) "1"
["aname"]=>
string(4) "yang"
}
[1]=>
object(SimpleXMLElement)#7 (2) {
["aid"]=>
string(1) "2"
["aname"]=>
string(4) "long"
}
}
}
}
很规则的一段代码。然后我去查了手册
$x=$xml->NewDataSet->aa;
foreach($x as $key)
{
echo $key->aid."<br />";
echo $key->aname."<br />";
}
这样就能遍历里边所有节点的数据了。同时我也得到了我想要的数据。