2012-07-03 23 views
5

Chiamata di un servizio web dal mio controllo:di analisi SOAP risposta

$client = new \SoapClient("http://.../webservice/NAME_OF_PAGE.asmx?WSDL"); 
$result = $client->EstadoHabitacionesFechas(); 

ottengo questo:

<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> 

Come posso analizzare questi dati e usarlo?

+0

Come è diverso da te in precedenza [domanda] (http://stackoverflow.com/questions/11310476/soapclient-parse-result)? – bluevector

risposta

10

Non si rende molto chiaro cosa sia "use", ma è chiaramente necessario qualche forma di analisi/ricerca XML.

Ad esempio, provare xml-caricando tale stringa e var_dump il risultato. Semplicemente elencando le varie proprietà dovresti mostrarti le opportunità.

In seguito, è possibile provare XPath search e "trucchi" più avanzati per accelerare il lavoro.

// 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"; 
    } 

Ci sono diversi parser che è possibile utilizzare, questo è un veloce e sporco.

Visualizza altro here.

dati grandi insiemi

Nota: per grandi insiemi di dati XML, I've found out that foreach is best.

E per grandi insiemi di dati in cui hai solo bisogno di qualche informazione, e l'intero file potrebbe non inserire in memoria disponibile, probabilmente si desidera utilizzare XMLParser, o XMLReader, e setacciare l'intero file attraverso il parser mentre mantenendo/manipolando (ad es. inviando un DB o visualizzando in HTML) solo le informazioni di cui hai bisogno.

Anche se questo non è in buona pratica generale, è possibile disattivare il buffer di uscita prima di entrare un ciclo di analisi lungo XML, l'output HTML non appena l'hai e flush() ing una volta ogni tanto. Ciò esternalizza l'HTML al server HTTP, occupando meno memoria nel processo PHP, a scapito della compressione leggermente inferiore (se si producono blocchi di HTML superiori a circa 40 K, la differenza è trascurabile) e proporzionalmente una migliore risposta (il l'utente "vede" che qualcosa accada più velocemente, anche se il completamento complessivo delle operazioni richiede un po 'più di tempo. L'esperienza è quella di un carico più veloce più veloce.

+1

Stavo solo per suggerire simpleXML. +1 –

+0

Grazie per la soluzione. Rimuovere lo spazio dei nomi è la soluzione perfetta. –

1

completa Codice di riferimento a SOAP di risposta file XML Ecco come analizzare vedremo in seguito esempio di codice

<?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> 

utilizzando questo codice si può facilmente ottenere tutti i dati di tabelle in variabili titolo $ e l'utilizzo che si può facilmente ottenere qualsiasi valore specifico facilmente ...

<?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; 
    ?> 
+0

La riga $ response = $ data-> xyzResult-> qualsiasi ha provocato un errore a causa del formato XML all'interno di SimpleXMLElement. Invece ho attivato la traccia nel costruttore SoapClient e ho usato $ soap -> __ getLastResponse() e ha funzionato. Grazie mille, hai salvato la mia giornata! –

Problemi correlati