152 votes

Meilleur analyseur XML pour PHP

J'ai utilisé l'analyseur XML auparavant, et même s'il fonctionnait correctement, je n'en étais pas satisfait en général, j'avais l'impression d'utiliser des solutions de contournement pour des choses qui devraient être des fonctionnalités de base.

J'ai vu récemment SimpleXML mais je ne l'ai pas encore essayé. Est-il plus simple ? Quels sont les avantages et les inconvénients des deux ? Avez-vous utilisé d'autres analyseurs syntaxiques ?

4 votes

Suggestion pour tous ceux qui lisent ceci : posez une question décrivant ce dont vous avez besoin. faire avec le XML (au-delà de sa simple analyse syntaxique) et vous obtiendrez probablement une bien meilleure réponse.

2 votes

Veuillez consulter la question de référence générale suivante pour la balise PHP : Comment analyser et traiter le HTML/XML avec PHP ?

110voto

Robert K Points 14893

Je dois dire que SimpleXML remporte la palme car il s'agit d'abord d'une extension, écrite en C, et elle est très rapide. Mais deuxièmement, le document analysé prend la forme d'un objet PHP. Vous pouvez donc "interroger" comme $root->myElement .

14 votes

Simplexml est le meilleur. Mais il n'est pas très bon pour travailler avec les espaces de noms, c'est parfois délicat.

5 votes

Je ne pense pas que ce soit le meilleur. Il ne supporte pas xml version="1.1" et affiche un avertissement à ce sujet (ma version de PHP est 5.3.6). Je sais que vous pouvez désactiver les avertissements et que cela fonctionne bien, mais je ne pense pas que ce soit une bonne solution. Imaginez donc ce qui se passera si votre fournisseur d'API modifie la version du document xml de 1.0 à 1.1 ? Le deuxième point est ce que @Gordon a souligné. SimpleXML charge le document entier en mémoire. C'est une bonne solution mais certainement pas la meilleure.

9 votes

Traiter les espaces de noms XML avec SimpleXML, c'est nul.

43voto

Gordon Points 156415

Jetez un coup d'œil à la page de PHP Extensions XML disponibles .

La principale différence entre XML Parser et SimpleXML est que ce dernier n'est pas un analyseur pull. SimpleXML est construit sur la base des extensions DOM et chargera le fichier XML entier en mémoire. XML Parser comme XMLReader ne chargera que le nœud actuel en mémoire. Vous définissez des gestionnaires pour des nœuds spécifiques qui seront déclenchés lorsque l'analyseur les rencontrera. C'est plus rapide et permet d'économiser de la mémoire. Vous payez pour cela le fait de ne pas pouvoir utiliser XPath.

Personnellement, je trouve SimpleXml assez limité (donc simple) dans ce qu'il offre par rapport à DOM. Vous pouvez passer facilement de DOM à SimpleXml, mais je ne m'en préoccupe généralement pas et j'emprunte directement la voie de DOM. DOM est une implémentation de l'API DOM du W3C, donc vous pouvez être familier avec d'autres langages, par exemple JavaScript.

0 votes

Qu'utilisez-vous le plus souvent ?

1 votes

Désolé - je cherchais juste des informations sur la différence entre les API et je suis venu ici. Les deux liens de la devzone sont morts et je ne sais pas s'ils doivent être supprimés ou mis à jour.

39voto

NexusRex Points 690

Il s'agit d'une fonction utile pour l'analyse syntaxique rapide et facile du xml lorsqu'une extension n'est pas disponible :

<?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
    $_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 ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_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;
}
?>

3 votes

A fonctionné comme un charme, là où simpleXml a échoué dans un couple de scripts sur lesquels je travaille, merci.

0 votes

Je reçois une erreur - Notice : Variable indéfinie : xml_array ?

2 votes

Thx, cela résout mon problème avec simpleXml !

19voto

Vahan Points 235

Bonjour, je pense que SimpleXml est très utile. Et avec lui, j'utilise 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

J'utilise de nombreuses configurations xml et cela m'aide à les analyser très rapidement. SimpleXml est écrit sur C donc c'est très rapide.

13voto

dcousineau Points 1646

Cela dépend de ce que vous essayez de faire avec les fichiers XML. Si vous essayez simplement de lire le fichier XML (comme un fichier de configuration), la puce maléfique a raison de suggérer SimpleXML puisqu'il crée ce qui revient à des ArrayObjects imbriqués. Par exemple, la valeur sera accessible par $xml->Root->child.

Si vous cherchez à manipuler les fichiers XML, il est probablement préférable d'utiliser DOM XML

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X