問題描述
從我的控制器調用網絡服務:
Calling a web service from my controller:
$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>
如何解析并使用這些數據?
How can I parse this data and use it?
推薦答案
您不太清楚使用"是什么,但您顯然需要某種形式的 XML 解析/搜索.
You don't make very clear what "use" is, but you clearly need some form of XML parsing/search.
例如,嘗試 xml 加載該字符串和 var_dump
結果.簡單地列舉各種屬性應該會向您展示機會.
For example, try xml-loading that string and var_dump
the result. Simply enumerating the various properties should show you the opportunities.
稍后,您可能會嘗試XPath 搜索 和更高級的技巧"以加快工作速度.
Later on, you might try XPath search and more advanced "tricks" to speed up the work.
// 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:
";
foreach($rooms as $i => $room)
{
print "Room {$i}: id={$room['id']} (official id: {$room->IdHabitacion}
";
print "Entrada {$room->FechaEntrada}, salida {$room->FechaSalida}
...
";
}
您可以使用多種解析器,這是一個快速而骯臟的解析器.
There are several parsers you can use, this is a quick and dirty one.
在此處查看更多信息.
注意:對于非常大的 XML 數據集,我發現 foreach
最好.
Note: for very large XML data sets, I've found out that foreach
is best.
對于只需要少量信息并且整個文件可能不適合可用內存的大型數據集,您可能需要使用 XMLParser 或 XMLReader,并在保持/操作的同時通過解析器篩選整個文件(例如發送到數據庫中,或顯示到HTML) 僅提供您需要的信息.
And for large data sets where you only need a few information, and the whole file might not fit into available memory, you will probably want to use XMLParser, or XMLReader, and sift the whole file through the parser while keeping/manipulating (e.g. sending in a DB, or displaying to HTML) only the information you need.
雖然這不是一般的好習慣,但您可以在進入一個長的 XML 解析循環之前關閉輸出緩沖,一旦得到它就輸出 HTML 并偶爾刷新().這會將 HTML 外包給 HTTP 服務器,在 PHP 進程中占用更少的內存,代價是壓縮稍差(如果你輸出超過大約 40K 的 HTML 塊,差異可以忽略不計)和成比例地更好的響應性(用戶看到"某些事情發生得更快,即使整體操作完成需要更長的時間.體驗是更快加載).
While this isn't in general good practice, you can turn output buffering off before entering a long XML parsing loop, outputting HTML as soon as you have it and flush()ing once in a while. This will outsource the HTML to the HTTP server, taking up less memory in the PHP process, at the expense of slightly inferior compression (if you output chunks of HTML of more than about 40K, the difference is negligible) and proportionally better responsivity (the user "sees" something happen faster, even if overall operation completion takes a little longer. The experience is that of a faster load).
這篇關于解析 SOAP 響應的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!