解析SOAP响应
调用从我的控制器Web服务:解析SOAP响应
$client = new \SoapClient("http://.../webservice/NAME_OF_PAGE.asmx?WSDL");
$result = $client->EstadoHabitacionesFechas();
我得到这个:
<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:MainDataTable="TablaEstadoHabitacion" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="TablaEstadoHabitacion">
<xs:complexType><xs:sequence>
<xs:element name="IdHabitacion" type="xs:int" minOccurs="0"/>
<xs:element name="FechaEntrada" type="xs:string" minOccurs="0"/>
<xs:element name="FechaSalida" type="xs:string" 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">
<DocumentElement xmlns="">
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<IdHabitacion>1</IdHabitacion>
<FechaEntrada>23/05/2012</FechaEntrada>
<FechaSalida>31/12/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
<IdHabitacion>2</IdHabitacion>
<FechaEntrada>23/05/2012</FechaEntrada>
<FechaSalida>29/06/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
<IdHabitacion>2</IdHabitacion>
<FechaEntrada>29/06/2012</FechaEntrada>
<FechaSalida>01/07/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion4" msdata:rowOrder="3" diffgr:hasChanges="inserted">
<IdHabitacion>3</IdHabitacion>
<FechaEntrada>02/06/2012</FechaEntrada>
<FechaSalida>03/06/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion5" msdata:rowOrder="4" diffgr:hasChanges="inserted">
<IdHabitacion>3</IdHabitacion>
<FechaEntrada>29/06/2012</FechaEntrada>
<FechaSalida>01/07/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion6" msdata:rowOrder="5" diffgr:hasChanges="inserted">
<IdHabitacion>4</IdHabitacion>
<FechaEntrada>29/06/2012</FechaEntrada>
<FechaSalida>01/07/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion7" msdata:rowOrder="6" diffgr:hasChanges="inserted">
<IdHabitacion>5</IdHabitacion>
<FechaEntrada>02/06/2012</FechaEntrada>
<FechaSalida>03/06/2012</FechaSalida>
</TablaEstadoHabitacion>
<TablaEstadoHabitacion diffgr:id="TablaEstadoHabitacion20" msdata:rowOrder="19" diffgr:hasChanges="inserted">
<IdHabitacion>10</IdHabitacion>
<FechaEntrada>02/06/2012</FechaEntrada>
<FechaSalida>03/06/2012</FechaSalida>
</TablaEstadoHabitacion>
</DocumentElement>
</diffgr:diffgram>
我如何分析这些数据,并使用它呢?
您不清楚“使用”是什么,但您显然需要某种形式的XML解析/搜索。
例如,尝试xml加载该字符串和var_dump
的结果。简单地列举各种属性应该会给你机会。
稍后,您可以尝试使用XPath search和更高级的“技巧”来加速工作。
// Remove namespaces
$xml = str_replace(array("diffgr:","msdata:"),'', $xml);
// Wrap into root element to make it standard XML
$xml = "<package>".$xml."</package>";
// Parse with SimpleXML - probably there're much better ways
$data = simplexml_load_string($xml);
$rooms = $data->package->diffgram->DocumentElement->TablaEstadoHabitacion;
print "We have " . count($rooms) . " rooms: \n";
foreach($rooms as $i => $room)
{
print "Room {$i}: id={$room['id']} (official id: {$room->IdHabitacion}\n";
print "Entrada {$room->FechaEntrada}, salida {$room->FechaSalida}\n...\n";
}
有几个解析器可以使用,这是一个快速和肮脏的解析器。
查看更多here。
大型数据集
注意:非常大的XML数据集,I've found out that foreach
is best。
而对于大型数据集,你只需要几个信息,以及整个文件可能不适合可用内存,你可能会想使用XMLParser中,或XMLReader,并通过分析程序,同时筛选整个文件保存/操作(例如发送数据库或显示为HTML)只有您需要的信息。
虽然这不是一般的好习惯,你可以输入长XML解析循环,只要你拥有了它,并刷新(输出HTML)的同时,荷兰国际集团前一次关闭输出缓冲关闭。这会将HTML外包给HTTP服务器,在PHP过程中占用较少的内存,代价是压缩稍差(如果输出的HTML大于40K,则差异可忽略不计),并且按比例更好地响应即使整体操作完成需要更长时间,用户“看到”某事发生得更快,这种体验是加快加载的)。
我只是想建议simpleXML。 +1 –
谢谢你的解决方案。删除命名空间是完美的解决方案。 –
完整的代码到SOAP响应XML文件在这里如何解析,我们将使用此代码,你可以很容易地在$ title变量中的所有表数据和使用请参阅下面的示例代码
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<xyzResponse xmlns="http://tempuri.org/">
<xyzResult>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table">
<xs:complexType>
<xs:sequence>
<xs:element name="myCityID" type="xs:int" minOccurs="0" />
<xs:element name="myCityName" type="xs:string" minOccurs="0" />
<xs:element name="myLat" type="xs:double" minOccurs="0" />
<xs:element name="myLon" type="xs:double" 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">
<NewDataSet xmlns="">
<Table diffgr:id="Table1" msdata:rowOrder="0">
<CityID>1</CityID>
<CityName>Ahmedabad</CityName>
<Lat>23.045839</Lat>
<Lon>72.550578</Lon>
</Table>
<Table diffgr:id="Table2" msdata:rowOrder="1">
<CityID>21</CityID>
<CityName>Amritsar</CityName>
<Lat>31.705603</Lat>
<Lon>74.807337</Lon>
</Table>
</NewDataSet>
</diffgr:diffgram>
</xyzResult>
</xyzResponse>
</soap:Body>
</soap:Envelope>
您可以轻松地得到轻松的任何具体值...
<?php
ini_set('soap.wsdl_cache_enabled', 0);
ini_set('soap.wsdl_cache_ttl', 900);
ini_set('default_socket_timeout', 15);
$apiauth =array('UserName'=>'USENAME','Password'=>'PASSWORD','UserCode'=>'1991');
$wsdl = 'http://SITENAME.com/service.asmx?WSDL';
try {
$soap = new SoapClient($wsdl);
$header = new SoapHeader('http://tempuri.org/', 'AuthHeader', $apiauth);
$soap->__setSoapHeaders($header);
$data = $soap->methodname($header);
}
catch(Exception $e) {
die($e->getMessage());
}
// echo "<pre>";
// print_r($data->xyzResult->any);
$response = $data->xyzResult->any;
$sxe = new SimpleXMLElement($response);
$sxe->registerXPathNamespace('d', 'urn:schemas-microsoft-com:xml-diffgram-v1');
$result = $sxe->xpath("//NewDataSet");
echo "<pre>";
foreach ($result[0] as $title) {
print_r($title);
}
die;
?>
线$响应= $ DATA-> xyzResult->任何被导致错误,因为内的SimpleXMLElement XML格式的。相反,我激活跟踪在SoapClient的构造和使用的肥皂$ - > __ getLastResponse()获得和它的工作。非常感谢,你救了我的一天! –
这是如何与你不同较早[问题](http://stackoverflow.com/questions/11310476/soapclient-parse-result )? – bluevector