2008-10-09 18 views
122

He usado el Analizador XML anteriormente, y aunque funcionó bien, no estaba contento con él en general, me sentía como si estuviera usando soluciones para cosas que deberían ser una funcionalidad básica.Mejor Analizador XML para PHP

Recientemente vi SimpleXML pero aún no lo he probado. ¿Es más simple? ¿Qué ventajas y desventajas tienen ambas? ¿Algún otro analizador que hayas usado?

+3

Sugerencia para cualquiera que lea esto: haga una pregunta que describa qué necesita * hacer * con el XML (más allá de simplemente analizarlo) y probablemente obtendrá una respuesta mucho mejor. – Shog9

+2

Consulte la siguiente pregunta de referencia general para la etiqueta PHP: ** [¿Cómo analizar y procesar HTML/XML con PHP?] (Http://stackoverflow.com/questions/3577641/how-to-parse-and-process -html-xml-with-php) ** – hakre

Respuesta

87

Tendría que decir SimpleXML toma la torta porque es, en primer lugar, una extensión, escrito en C, y es muy rápido. Pero segundo, el documento analizado toma la forma de un objeto PHP. Para que pueda "consultar" como $root->myElement.

+12

simplexml es el mejor. Pero no es tan bueno trabajar con espacios de nombres, a veces puede ser complicado – pleasedontbelong

+2

Sí, creo que es mejor también. Y uso xpath con él. $ xml-> xpath ("// block"); // ESTE ES SUPER :) – Vahan

+5

No creo que sea lo mejor. No es compatible con xml version = "1.1" y arroja una advertencia sobre este hecho (mi versión de PHP es 5.3.6). Sé que puede desactivar las advertencias y funciona bien, pero no creo que sea una buena solución. Entonces, imagina lo que sucederá si tu proveedor de API cambia la versión del documento xml de 1.0 a 1.1. Segundo pensar es lo que señaló @Gordon. SimpleXML carga todo el documento en la memoria. Es una buena solución, pero ciertamente no es la mejor. – Karol

11

Depende de lo que intente hacer con los archivos XML. Si solo está tratando de leer el archivo XML (como un archivo de configuración), The Wicked Flea tiene razón al sugerir SimpleXML, ya que crea lo que equivale a ArrayObjects anidados. p.ej. el valor será accesible por $ xml-> root-> child.

Si usted está buscando para manipular los archivos XML que está probablemente mejor fuera de uso DOM XML

38

Tenga una mirada en PHP de available XML extensions y ver http://devzone.zend.com/243/ y http://devzone.zend.com/1035/ para una discusión de esos.

La principal diferencia entre XML Parser y SimpleXML es que este último no es un analizador de extracción. SimpleXML está construido sobre las extensiones DOM y cargará todo el archivo XML en la memoria. XML Parser como XMLReader solo cargará el nodo actual en la memoria. Define controladores para nodos específicos que se activarán cuando el analizador lo encuentre. Eso es más rápido y ahorra en memoria. Usted paga por eso al no poder usar XPath.

Personalmente, considero que SimpleXml es bastante limitante (por lo tanto simple) en lo que ofrece sobre DOM. Sin embargo, puede cambiar fácilmente entre DOM y SimpleXml, pero generalmente no me molesto y tomo la ruta DOM directamente. DOM es una implementación de la API DOM del W3C, por lo que es posible que esté familiarizado con ella desde otros lenguajes, por ejemplo, JavaScript.

21

Ésta es una función útil para el análisis de XML rápido y fácil cuando una extensión no está 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

funcionó como un encanto, donde simpleXml falló en un par de scripts en los que estoy trabajando, gracias –

+0

obteniendo el error- Aviso: Variable indefinida: xml_array? – shfkktm

0

el analizador crxml es un verdadero analizador fácil.

Esta clase tiene una función de búsqueda, que toma un nombre de nodo con cualquier espacio de nombres como argumento. Busca en el xml el nodo e imprime la declaración de acceso para acceder a ese nodo usando esta clase. Esta clase también hace que la generación de xml sea muy fácil.

se puede descargar de esta clase en

http://freshmeat.net/projects/crxml

o desde phpclasses.org

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

+9

Probablemente quieras revelar que eres el autor de esta clase. –

+0

PHPClasses.org sigue siendo una cosa? Edit: Oh, supongo que todavía estaba en '11 –

14

Hola Creo que la SimpleXML es muy útil. Y con eso estoy 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 muchas configuraciones xml y esto me ayuda a analizarlas realmente rápido. SimpleXml está escrito en C así que es muy rápido.