2014-09-05 11 views
7

sto in fase di elaborazione una vasta file XML, per fare un po del trattamento più semplice che ho usato il seguente metodo come detto ampiamente su stack overflowConversione XML in array PHP con JSON sta cancellando le caratteristiche su alcuni elementi

$xml = simplexml_load_string($xml_string); 
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 

questo è stato impressionante, ma andare oltre il mio codice ho notato alcuni casi in cui gli attributi su alcuni elementi non sono la conversione in modo corretto, in questa fase $json = json_encode($xml);

Ecco un esempio XML ridotta.

<?xml version="1.0"?> 
<property> 
    <landDetails> 
     <area unit="squareMeter"/> 
    </landDetails> 
    <buildingDetails> 
     <area unit="squareMeter">100</area> 
    </buildingDetails> 
</property> 

e qui è l'uscita.

Array (
    [landDetails] => Array (
     [area] => Array (
      [@attributes] => Array (
       [unit] => squareMeter 
      ) 
     ) 
    ) 
    [buildingDetails] => Array (
     [area] => 100 
    ) 
) 

Come visto sopra, se l'elemento contiene alcuna informazione su quel nodo esatto gli attributi associati a tale elemento non vengono elaborati. Ciò sta causando una significativa perdita di dati tra la conversione.

Qualcuno sa come risolvere questo problema?

Grazie in anticipo!

risposta

4

Gli elementi vengono elaborati, non vengono semplicemente visualizzati nel caso in cui il nodo abbia attributi e valori. In tal caso, vengono visualizzati solo i valori.

La conversione json/array che si sta facendo non tiene conto di ciò e mantiene solo i valori visualizzati. Temo che non v'è alcun trucco per farlo, ma qui è una funzione che ho usato quando non sapevo come convertire astutamente elementi SimpleXML (E che sta gestendo gli attributi ei valori separatamente)

function simplexml_to_array ($xml, &$array) { 

    // Empty node : <node></node> 
    $array[$xml->getName()] = ''; 

    // Nodes with children 
    foreach ($xml->children() as $child) { 
    simplexml_to_array($child, $array[$xml->getName()]); 
    } 

    // Node attributes 
    foreach ($xml->attributes() as $key => $att) { 
     $array[$xml->getName()]['@attributes'][$key] = (string) $att; 
    } 

    // Node with value 
    if (trim((string) $xml) != '') { 
    $array[$xml->getName()][] = (string) $xml; 
    } 

} 

$xml = simplexml_load_string($xml); 
simplexml_to_array($xml, $arr); 
var_dump($arr); 

uscita :

array(1) { 
    ["property"]=> 
    array(2) { 
    ["landDetails"]=> 
    array(1) { 
     ["area"]=> 
     array(1) { 
     ["@attributes"]=> 
     array(1) { 
      ["unit"]=> 
      string(11) "squareMeter" 
     } 
     } 
    } 
    ["buildingDetails"]=> 
    array(1) { 
     ["area"]=> 
     array(2) { 
     ["@attributes"]=> 
     array(1) { 
      ["unit"]=> 
      string(11) "squareMeter" 
     } 
     [0]=> 
     string(3) "100" 
     } 
    } 
    } 
} 
+0

Solo guardando un po 'di più il codice sopra non sembra passare in una matrice di attributi sui primi due elementi figlio xml? Ad esempio, utilizzando l'XML sopra se si aggiunge un attributo 'color =" red "' su 'property', quindi un attributo' color = "green" 'su' landDetails' e 'buildingDetails' e un' color = "blu "attributo su area". Solo l'attributo blu verrà esportato nell'array precedente. –

+1

@DevonMather Destra, non so perché questo ciclo foreach è stato nel controllo has_children. In realtà, questo controllo has_children non era necessario. Ho capito che SimpleXML restituisce una stringa con spazi e interruzione di riga. 'trim' è sufficiente per rilevare se non ha un valore reale. Ho provato questo nuovo codice su diverse strutture XML, e ora sembra ok. :) – Sugar

+0

Questo codice non sembra funzionare. ' xxx 'Qui' aaa' e 'bbb' non appaiono nell'output. –

Problemi correlati