web-dev-qa-db-fra.com

Meilleur analyseur XML pour PHP

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

J'ai récemment vu SimpleXML mais je ne l'ai pas encore essayé. Est-ce plus simple? Quels sont les avantages et les inconvénients des deux? D'autres analyseurs que vous avez utilisés?

143
Murat Ayfer

Je dirais que SimpleXML prend le gâteau car c'est d'abord une extension, écrite en C, et très rapide. Mais deuxièmement, le document analysé prend la forme d'un objet PHP. Vous pouvez donc "interroger" comme $root->myElement.

104
Robert K

Regardez PHP extensions XML disponibles et voyez http://devzone.zend.com/243/ et http://devzone.zend.com/1035 / pour en discuter.

La principale différence entre XML Parser et SimpleXML est que ce dernier n'est pas un analyseur Pull. SimpleXML est construit sur les extensions DOM et chargera la totalité du fichier XML en mémoire. Un analyseur XML 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 le rencontrera. C'est plus rapide et permet d'économiser de la mémoire. Vous ne payez que pour ne pas pouvoir utiliser XPath.

Personnellement, je trouve SimpleXml assez limitatif (donc simple) dans ce qu’il offre sur DOM. Vous pouvez facilement basculer entre DOM et SimpleXml, mais je ne me dérange généralement pas et choisis directement la route DOM. DOM est une implémentation de l'API DOM du W3C. Vous pouvez donc vous en familiariser avec d'autres langages, par exemple JavaScript.

41
Gordon

C'est une fonction utile pour analyser rapidement et facilement 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;
}
?>
28
NexusRex

Bonjour, je pense que le SimpleXml est très utile. Et avec cela 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 beaucoup de configurations xml et cela m'aide à les analyser très rapidement. SimpleXml est écrit sur C, donc c'est très rapide.

16
Vahan

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), The Wicked Flea suggère correctement SimpleXML car il crée ce qui revient à imbriqué ArrayObjects. par exemple. la valeur sera accessible par $ xml-> root-> child.

Si vous cherchez à manipuler les fichiers XML, vous ferez probablement mieux d'utiliser DOM XML

11
dcousineau

l'analyseur CXML est un véritable facile à analyser.

Cette classe a une fonction de recherche, qui prend un nom de noeud avec un espace de nom en argument. Il recherche le noeud dans le fichier XML et imprime la déclaration d'accès pour accéder à ce noeud à l'aide de cette classe. Cette classe facilite également la génération XML.

vous pouvez télécharger cette classe sur

http://freshmeat.net/projects/crxml

ou de phpclasses.org

http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html

0
Sandeep.C.R