Domanda

    

Questa domanda ha già una risposta qui:

         

Ho usato XML Parser in precedenza, e anche se ha funzionato bene, non ero contento in generale, mi sembrava di usare soluzioni alternative per cose che dovrebbero essere funzionalità di base.

Di recente ho visto SimpleXML ma non l'ho ancora provato. È più semplice? Quali vantaggi e svantaggi hanno entrambi? Qualche altro parser che hai usato?

È stato utile?

Soluzione

Dovrei dire che SimpleXML prende la torta perché è innanzitutto un'estensione, scritto in C ed è molto veloce. Ma in secondo luogo, il documento analizzato assume la forma di un oggetto PHP. Quindi puoi " interrogare " come $ root- > myElement .

Altri suggerimenti

Dai un'occhiata alle estensioni XML disponibili di PHP e vedi http://devzone.zend.com/243/ e http://devzone.zend.com/1035/ per una discussione di questi.

La principale differenza tra XML Parser e SimpleXML è che quest'ultimo non è un pull parser. SimpleXML è basato sulle estensioni DOM e caricherà l'intero file XML in memoria. XML Parser come XMLReader caricherà solo il nodo corrente in memoria. Si definiscono gestori per nodi specifici che verranno attivati ??quando il parser lo incontra. È più veloce e consente di risparmiare memoria. Paghi per questo non potendo usare XPath.

Personalmente, trovo SimpleXml abbastanza limitante (quindi semplice) in ciò che offre su DOM. Puoi passare facilmente tra DOM e SimpleXml, ma di solito non mi preoccupo e vado direttamente al percorso DOM. DOM è un'implementazione dell'API DOM W3C, quindi potresti conoscerla da altre lingue, ad esempio JavaScript.

Questa è una funzione utile per l'analisi XML semplice e veloce quando un'estensione non è disponibile:

<?php
/**
 * Convert XML to an Array
 *
 * @param string  $XML
 * @return array
 */
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    

Questa è una funzione utile per l'analisi XML semplice e veloce quando un'estensione non è disponibile:

<*>tmp=''; foreach ($vals as $xml_elem) { $x_tag=$xml_elem['tag']; $x_level=$xml_elem['level']; $x_type=$xml_elem['type']; if ($x_level!=1 && $x_type == 'close') { if (isset($multi_key[$x_tag][$x_level])) $multi_key[$x_tag][$x_level]=1; else $multi_key[$x_tag][$x_level]=0; } if ($x_level!=1 && $x_type == 'complete') { if (

Questa è una funzione utile per l'analisi XML semplice e veloce quando un'estensione non è disponibile:

<*>tmp==$x_tag) $multi_key[$x_tag][$x_level]=1;

Questa è una funzione utile per l'analisi XML semplice e veloce quando un'estensione non è disponibile:

<*>tmp=$x_tag; } } // jedziemy po tablicy foreach ($vals as $xml_elem) { $x_tag=$xml_elem['tag']; $x_level=$xml_elem['level']; $x_type=$xml_elem['type']; if ($x_type == 'open') $level[$x_level] = $x_tag; $start_level = 1; $php_stmt = '$xml_array'; if ($x_type=='close' && $x_level!=1) $multi_key[$x_tag][$x_level]++; while ($start_level < $x_level) { $php_stmt .= '[$level['.$start_level.']]'; if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level]) $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']'; $start_level++; } $add=''; if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) { if (!isset($multi_key2[$x_tag][$x_level])) $multi_key2[$x_tag][$x_level]=0; else $multi_key2[$x_tag][$x_level]++; $add='['.$multi_key2[$x_tag][$x_level].']'; } if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) { if ($x_type == 'open') $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; else $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];'; eval($php_stmt_main); } if (array_key_exists('attributes', $xml_elem)) { if (isset($xml_elem['value'])) { $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; eval($php_stmt_main); } foreach ($xml_elem['attributes'] as $key=>$value) { $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;'; eval($php_stmt_att); } } } return $xml_array; } ?>

Ciao, penso che SimpleXml sia molto utile. E con esso sto usando xpath ;

$xml = simplexml_load_file("som_xml.xml");

$blocks  = $xml->xpath('//block'); //gets all <block/> tags
$blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are   <layout/>  tags

Uso molte configurazioni XML e questo mi aiuta ad analizzarle molto velocemente. SimpleXml è scritto su C quindi è molto veloce.

Dipende da cosa stai cercando di fare con i file XML. Se stai solo cercando di leggere il file XML (come un file di configurazione), The Wicked Flea è corretto nel suggerire SimpleXML poiché crea ciò che equivale a ArrayObjects nidificato. per esempio. il valore sarà accessibile da $ xml- > root- > child.

Se stai cercando di manipolare i file XML, probabilmente ti conviene usare DOM XML

il parser crxml è davvero facile da analizzare.

Questa classe ha una funzione di ricerca, che prende come argomento un nome di nodo con qualsiasi spazio dei nomi. Cerca l'xml per il nodo e stampa l'istruzione access per accedere a quel nodo usando questa classe. Questa classe semplifica anche la generazione di XML.

puoi scaricare questa classe su

http://freshmeat.net/projects/crxml

o da phpclasses.org

http: //www.phpclasses. org / pacchetto / 6769-PHP manipolare-XML-documenti-as-array.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top