Migliore parser XML per PHP [duplicato]
-
06-07-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Come analizzare ed elaborare HTML / XML in PHP? 30 risposte
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?
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