解析来自.net服务(使用php)的(soap)结果时遇到问题


trouble parsing (soap) result from .NET service (with php)

我遇到了一些问题,而与。net soap服务器与PHP连接。我在StackOverflow上运行了一些搜索,也在谷歌上,但找不到解决方案/同样的问题。

是这样的。我正试图从服务器获取一些数据。请求正常,但是响应似乎无效。

响应在该对象中只包含一个对象元素"any"。显示了原始xml/xsd数据。

我也试着用不同的方法(如simple_xml &Domdocument),但结果是"invalid data/xml"

有没有人遇到过这个问题或者有合适的解决方法?

您将在下面发现请求的"结果"转储,如果需要更多数据,请询问。

干杯Sebastiaan

GetArticleListResult Object
(
    [any] => <xs:schema xmlns:mstns="www.rentplus.be/webservices/ArticleList.xsd" xmlns="www.rentplus.be/webservices/ArticleList.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="dsArticleList" targetNamespace="www.rentplus.be/webservices/ArticleList.xsd" attributeFormDefault="qualified" elementFormDefault="qualified"><xs:element name="dsArticleList" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="ArticleList"><xs:complexType><xs:sequence><xs:element name="Article_Key" type="xs:string" minOccurs="0"/><xs:element name="Warehouse_Number" type="xs:string" minOccurs="0"/><xs:element name="Date_Creation" type="xs:dateTime" minOccurs="0"/><xs:element name="Date_Last_Modification" type="xs:dateTime" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><dsArticleList xmlns="www.rentplus.be/webservices/ArticleList.xsd"><ArticleList diffgr:id="ArticleList1" msdata:rowOrder="0" diffgr:hasChanges="inserted"><Article_Key>GELUM-LE400</Article_Key><Warehouse_Number>01</Warehouse_Number><Date_Creation>0001-01-01T00:00:00+01:00</Date_Creation><Date_Last_Modification>2011-08-10T00:00:00+02:00</Date_Last_Modification></ArticleList></dsArticleList></diffgr:diffgram>
)

我刚刚自己解决了这个问题。我对XML和SOAP知之甚少,但是根据我所做的研究,默认的。net web服务与名称空间和其他包装器混淆在一起。而且,php soap客户机使情况变得更糟,无法生成合适的对象。您得到的响应是1/2对象和1/2 XML。毫无意义,对吧!

我加载了对象的any元素并将其加载到

$wsdl= {url of your WSDL}; //assuming its some WSDL generated by MS .net or visual studio.  Something a normal human WOULD NOT WRITE. 
$client = new SoapClient($wsdl);        //create a soap client and load WSDL
$result = $client->GetQuote($param);    //get result of the soap call
$quote = $result->GetQuoteResult;       //Get the response-- its an object.  this part is weird because it's an object containing xml parts.  There is no easy path to use it.
$xml_object = new SimpleXMLElement($quote->any);  //Grab the xml part and load as partial XML --> this took forever to figure out. anger here!!
foreach ($xml_object->Quote->Plans as $plan){       //here in my data, the XML becomes a standard ARRAY--> really getting mad now.
    //grab a few items out of the array for kicks.  Don't grab all of them, cuz some switch back to XML --> make up your mind.
    $item_names=array("QuoteID","ProductID","ProductName","PlanTypeID",
        "PlanName", "Deductible","Coinsurance", "CoverageAmount",
        "Duration", "FirstPayment", "RecurringPayment"  );
    foreach ($item_names as $item_name){
        print "$item_name=".$plan->$item_name.",  ";
    }
    print "'n";
}
print "</pre>";
</pre>

现在你已经从visual studio .net web service中检索到了你想要的信息。简单,对! !

下面我将介绍如何处理SOAP请求和响应。你得到的Object包含any包含你的数据,所以Object->any这样做:

$WS_settings = array(
    'address' => 'http://example.com.asmx?wsdl',
    'username' => 'login',
    'password' => 'pass'
);
$WS_client = new SoapClient($WS_settings['address']);
$WS_params = new stdClass();
$WS_params->Username = $WS_settings['username'];
$WS_params->Password = $WS_settings['password'];
$WS_params->IdBrand = 1;
$WS_params->IdModel = 2;
$WS_params->IdApplication = 3;
$result = $WS_client->Get_Products($WS_params)->Get_ProductsResult->any;
var_dump($result);