2008-10-09 9 views
122

J'ai déjà utilisé l'analyseur XML, et même si cela fonctionnait bien, je n'étais pas content de cela en général, j'avais l'impression d'utiliser des solutions de contournement pour les fonctionnalités de base.Best XML Parser pour PHP

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?

+3

Suggestion pour quiconque lisant ceci: posez une question décrivant ce que vous devez faire avec le XML (au-delà de simplement l'analyser) et vous obtiendrez probablement une bien meilleure réponse. – Shog9

+2

Reportez-vous à la question de référence générale suivante pour la balise PHP: ** [Comment analyser et traiter HTML/XML avec PHP?] (Http://stackoverflow.com/questions/3577641/how-to-parse-and-process -html-xml-with-php) ** – hakre

Répondre

87

Je devrais dire SimpleXML prend le gâteau parce que c'est d'abord une extension, écrite en C, et est très rapide. Mais en second lieu, le document analysé prend la forme d'un objet PHP. Donc vous pouvez "interroger" comme $root->myElement.

+12

simplexml est le meilleur. Mais ça ne marche pas bien avec les espaces de noms, ça peut parfois être compliqué – pleasedontbelong

+2

Oui je pense que c'est mieux aussi. Et j'utilise xpath avec. $ xml-> xpath ("// block"); // C'EST SUPER :) – Vahan

+5

Je ne pense pas que ce soit le meilleur. Il ne supporte pas xml version = "1.1" et lance un avertissement à ce sujet (ma version de PHP est 5.3.6). Je sais que vous pouvez désactiver les avertissements et que tout fonctionne bien, mais je ne pense pas que ce soit une bonne solution. Alors, imaginez ce qui se passera, si votre fournisseur d'API change la version du document xml de 1.0 à 1.1? Deuxième réflexion est ce que @Gordon a souligné. SimpleXML charge tout le document en mémoire. C'est une bonne solution mais certainement pas le meilleur. – Karol

11

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 a raison de suggérer SimpleXML puisqu'il crée ce qui s'apparente à ArrayObjects imbriqué. par exemple. La valeur sera accessible par $ xml-> root-> child.

Si vous cherchez à manipuler les fichiers XML que vous êtes probablement mieux loti en utilisant DOM XML

38

Jetez un oeil à PHP de available XML extensions et de voir http://devzone.zend.com/243/ et http://devzone.zend.com/1035/ pour une discussion de ceux-ci.

La principale différence entre XML Parser et SimpleXML est que ce dernier n'est pas un analyseur par extraction. SimpleXML est construit au-dessus des extensions DOM et chargera le fichier XML entier en mémoire. XML Parser comme XMLReader chargera seulement le noeud courant dans la mémoire. Vous définissez des gestionnaires pour des nœuds spécifiques qui seront déclenchés lorsque l'analyseur le rencontre. C'est plus rapide et économise de la mémoire. Vous payez pour cela sans pouvoir utiliser XPath.

Personnellement, je trouve que SimpleXml est assez limitatif (donc simple) dans ce qu'il offre sur DOM. Vous pouvez facilement basculer entre DOM et SimpleXml, mais en général, je ne m'occupe pas de la route DOM. DOM est une implémentation de l'API DOM du W3C, vous pouvez donc la connaître dans d'autres langues, par exemple JavaScript.

21

Cette fonction est utile pour l'analyse syntaxique xml rapide et facile lorsqu'une extension 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; 
} 
?> 
+0

travaillé comme un charme, où simpleXml a échoué dans un couple de scripts sur lesquels je travaille, merci –

+0

obtenir l'erreur- Avis: Undefined variable: xml_array? – shfkktm

0

l'analyseur crxml est un réel facile à parser.

Cette classe a une fonction de recherche, qui prend un nom de noeud avec n'importe quel espace de noms comme argument. Il recherche le nœud XML pour le nœud et imprime l'instruction d'accès pour accéder à ce nœud en utilisant cette classe. Cette classe rend également la génération de XML très facile.

vous pouvez télécharger cette classe à

http://freshmeat.net/projects/crxml

ou de phpclasses.org

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

+9

Vous voudrez probablement révéler que vous êtes l'auteur de cette classe. –

+0

PHPClasses.org est encore une chose? Edit: Oh, je suppose que c'était encore en '11 –

14

Salut, je pense que le SimpleXML est très utile. Et avec cela j'utilise xpath; J'utilise beaucoup de configs xml et cela m'aide à les analyser très rapidement. SimpleXml est écrit sur C donc c'est très rapide.