2016-03-23 4 views
0

Ich benutze curl, um ein externes XML-Dokument zu erhalten und es in ein Array zu konvertieren.PHP - Konvertieren von XML in Array fehlt einige Informationen aus XML-Zeichenfolge

Der Code funktioniert fast perfekt, abgesehen von einem Knoten im XML wird nicht verarbeitet und in meinem Array abgelegt.

Unter <drivers> gibt es einen Code für jeden Fahrer: <driver code="TM1"> aber durch meine Array als @attribute Array wie die anderen wie <collection date="20160324">

wissen Hat jemand bekommen nicht abgeholt, warum dies geschieht?

XML:

<findit xmlns="http://www.URL.COM" version="8" type="TIX" date="20160323"> 
    <account code="XXXXXX"> 
    <customers> 
     <customer code="12345"> 
     <status code="0">Success</status> 
     <logistic-jobs> 
      <logistic-job id="12345" date="20160324" status="PLA" modified="201603231420"> 
     <number> 
      <number1>479599</number1> 
      <number3>11221</number3> 
     </number> 
     <collection date="20160324" time="0500"> 
      <name>JOHN SMITH</name> 
      <address1>UNIT 3 DAVEY ROAD</address1> 
      <address2>FIELDS END BUSINESS PARK</address2> 
      <address3>GOLDTHORPE</address3> 
      <address4>ROTHERHAM</address4> 
      <address5>S63 0JF</address5> 
     </collection> 
     <delivery date="20160324" time="1200"> 
      <address1>EXAMPLE</address1> 
      <address2>GLENEAFLES FARM</address2> 
      <address3>GLENEAGLES CLOSE</address3> 
      <address4>STANWELL, MIDDLESEX</address4> 
      <address5>TW19 7PD</address5> 
     </delivery> 
     <extra> 
      <address1>45FT C/SIDER</address1> 
      <address2>No</address2> 
      <address4>CEMENT</address4> 
     </extra> 
     <drivers> 
      <driver code="TM1">DAVE SMITH (DAYS)</driver> 
     </drivers> 
     <load weight="27600.00" volume="0.00"> 
      <pallets full="23" half="0" quarter="0" blue="0" oversize="0"/> 
     </load> 
     </logistic-job> 
    </logistic-jobs> 
    </customer> 
</customers> 
</account> 
</findit> 

PHP:

$job_array = json_decode(json_encode(simplexml_load_string($xml)), true); 

if(is_array($job_array['account']['customers']['customer'])) { 

    // Foreach customer in array 
    foreach($job_array['account']['customers']['customer'] as $i => $customer) { 

     // If status is set to success 
     if($customer['status'] == "Success") { 

      // For each job 
      foreach($customer['logistic-jobs']['logistic-job'] as $i => $job) { 

       echo '<pre>'; print_r($job); echo '</pre>'; 

      } 

     } 

    } 

} 

OUTPUT:

Array 
(
[@attributes] => Array 
    (
     [id] => 12345 
     [date] => 20160324 
     [status] => PLA 
     [modified] => 201603231420 
    ) 

[number] => Array 
    (
     [number1] => 479599 
     [number3] => 11221 
    ) 

[collection] => Array 
    (
     [@attributes] => Array 
      (
       [date] => 20160324 
       [time] => 0500 
      ) 

     [name] => JOHN SMITH 
     [address1] => UNIT 3 DAVEY ROAD 
     [address2] => FIELDS END BUSINESS PARK 
     [address3] => GOLDTHORPE 
     [address4] => ROTHERHAM 
     [address5] => S63 0JF 
    ) 

[delivery] => Array 
    (
     [@attributes] => Array 
      (
       [date] => 20160324 
       [time] => 1200 
      ) 

     [address1] => EXAMPLE 
     [address2] => GLENEAFLES FARM 
     [address3] => GLENEAGLES CLOSE 
     [address4] => STANWELL, MIDDLESEX 
     [address5] = TW19 7PD 
    ) 

[extra] => Array 
    (
     [address1] => 45FT C/SIDER 
     [address2] => No 
     [address4] => CEMENT 
    ) 

[drivers] => Array 
    (
     [driver] => DAVE SMITH (DAYS) 
    ) 

[load] => Array 
    (
     [@attributes] => Array 
      (
       [weight] => 21509.00 
       [volume] => 0.00 
      ) 

     [pallets] => Array 
      (
       [@attributes] => Array 
        (
         [full] => 52 
         [half] => 0 
         [quarter] => 0 
         [blue] => 0 
         [oversize] => 0 
        ) 

      ) 

    ) 

) 
+0

Ich denke, [diese] (http://php.net/manual/en/function.simplexml-load -string.php # 80855) wird etwas hilfreich sein – xmike

+0

Danke für Ihre Antwort @xmike, aber ich habe es bereits versucht und es hat mir immer noch nicht den 'Code', den ich brauche. –

Antwort

3

Ich habe eine einfache Antwort für Sie: nicht konvertieren XML in ein Array. SimpleXML hat eine sehr nützliche API, um das XML-Dokument zu durchlaufen und die gewünschten Daten zu finden. schmeißen Sie den schrecklichen json_decode(json_encode( hack weg und schauen Sie sich die examples in the PHP manual an.

In diesem Fall würde echo $driver geben Sie den Inhalt (Treibername) und echo $driver['code'] würde Ihnen den Attributwert geben; klar, eine einfache Anordnung kann diese bequeme Magie nicht haben, weshalb die Umwandlung in eine Ihnen Probleme bereitet.

Denken Sie daran, dass print_r auch Dinge vor Ihnen verbergen, und Sie möchten möglicherweise a dedicated debugging function.

Hier ist ein Beispiel (mit live demo) des Codes und Namen der einzelnen Fahrer bekommen:

$job_simple = simplexml_load_string($xml); 

if(isset($job_simple->account->customers->customer)) { 

    // Foreach customer in array 
    foreach($job_simple->account->customers->customer as $i => $customer) { 

     // If status is set to success 
     if((string)$customer->status == "Success") { 

      // For each job 
      foreach($customer->{'logistic-jobs'}->{'logistic-job'} as $i => $job) { 
       echo "<ul>\n"; 
       foreach ($job->drivers->driver as $driver) { 
        echo "<li> {$driver['code']}: $driver\n"; 
       } 
       echo "</ul>\n"; 
      } 
     } 
    } 
} 
+0

Arbeitete perfekt, vielen Dank für Ihre Hilfe! –