2008-10-09 13 views
122

Ich habe den XML-Parser zuvor verwendet, und obwohl es OK funktioniert, war ich nicht im Allgemeinen mit ihm zufrieden, es fühlte sich an wie ich Workarounds für Dinge, die grundlegende Funktionalität sein sollte.Beste XML-Parser für PHP

Ich habe vor kurzem SimpleXML gesehen, aber ich habe es noch nicht ausprobiert. Ist es einfacher? Welche Vor- und Nachteile haben beide? Irgendwelche anderen Parser, die du benutzt hast?

+3

Vorschlag für jeden, der dies liest: Stellen Sie eine Frage, die beschreibt, was Sie mit dem XML * tun * müssen, und Sie werden wahrscheinlich eine viel bessere Antwort erhalten. – Shog9

+2

Bitte beachten Sie die folgende allgemeine Referenzfrage für das PHP-Tag: ** [Wie man HTML/XML mit PHP parst und verarbeitet?] (Http://stackoverflow.com/questions/3577641/how-to-parse-and-process -html-xml-with-php) ** – hakre

Antwort

87

Ich würde sagen, SimpleXML nimmt den Kuchen, weil es erstens eine Erweiterung ist, in C geschrieben, und ist sehr schnell. Aber zweitens hat das geparste Dokument die Form eines PHP-Objekts. So können Sie wie $root->myElement "abfragen".

+12

simplexml ist das beste. Aber ist es nicht so gut mit Namespaces zu arbeiten, kann es manchmal schwierig werden – pleasedontbelong

+2

Ja, ich denke, es ist auch das Beste. Und ich benutze XPath damit. $ xml-> xpath ("// block"); // DAS IST SUPER :) – Vahan

+5

Ich denke nicht, dass es das Beste ist. Es unterstützt nicht xml version = "1.1" und warnt vor dieser Tatsache (meine PHP-Version ist 5.3.6). Ich weiß, dass Sie Warnungen deaktivieren können, und es funktioniert gut, aber ich denke nicht, dass es eine gute Lösung ist. Stellen Sie sich vor, was passiert, wenn Ihr API-Provider die XML-Dokumentversion von 1.0 auf 1.1 ändert? Zweitens denke @Gordon wies darauf hin. SimpleXML lädt das gesamte Dokument in den Speicher. Es ist eine gute Lösung, aber sicherlich nicht die beste. – Karol

11

Es hängt davon ab, was Sie mit den XML-Dateien zu tun versuchen. Wenn Sie nur versuchen, die XML-Datei zu lesen (wie eine Konfigurationsdatei), ist The Wicked Flea korrekt, wenn sie SimpleXML vorschlägt, da es genau so viele verschachtelte ArrayObjects erzeugt. z.B. Der Wert wird über $ xml-> root-> child verfügbar sein.

Wenn Sie schauen, um die XML-Dateien, die Sie wahrscheinlich aus DOM XML

38

mit besten sind zu manipulieren Werfen Sie einen Blick auf die PHP-available XML extensions und http://devzone.zend.com/243/ und http://devzone.zend.com/1035/ für eine Diskussion über diejenigen sehen.

Der Hauptunterschied zwischen XML Parser und SimpleXML besteht darin, dass letzterer kein Pull-Parser ist. SimpleXML baut auf den DOM-Erweiterungen auf und lädt die gesamte XML-Datei in den Speicher. XML Parser wie XMLReader lädt nur den aktuellen Knoten in den Speicher. Sie definieren Handler für bestimmte Knoten, die ausgelöst werden, wenn der Parser darauf stößt. Das ist schneller und spart Speicher. Sie zahlen dafür, dass Sie XPath nicht verwenden können.

Persönlich finde ich SimpleXml recht einschränkend (daher einfach) in dem, was es über DOM bietet. Sie können zwar leicht zwischen DOM und SimpleXml wechseln, aber normalerweise mache ich mir keine Mühe und gehe direkt auf die DOM-Route. DOM ist eine Implementierung der W3C-DOM-API, daher kennen Sie es aus anderen Sprachen, zum Beispiel JavaScript.

21

Dies ist eine nützliche Funktion für die schnelle und einfache XML-Parsing, wenn eine Erweiterung nicht verfügbar:

<?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

funktioniert wie ein Charme, wo SimpleXml in ein paar Skripts fehlgeschlagen bin ich arbeite, danke –

+0

bekommen Fehler- Hinweis: Undefinierte Variable: xml_array? – shfkktm

0

der crxml Parser ist ein wirklich einfach zu Parser.

Diese Klasse hat eine Suchfunktion, die einen Knotennamen mit einem beliebigen Namespace als Argument verwendet. Er durchsucht das XML nach dem Knoten und gibt die Zugriffsanweisung aus, um mit dieser Klasse auf diesen Knoten zuzugreifen. Diese Klasse macht auch die XML-Generierung sehr einfach.

Sie diese Klasse herunterladen können

http://freshmeat.net/projects/crxml

oder von phpclasses.org

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

+9

Sie möchten wahrscheinlich angeben, dass Sie der Autor dieser Klasse sind. –

+0

PHPClasses.org ist immer noch eine Sache? Edit: Oh, ich denke, es war noch im Jahr '11 –

14

Hallo Ich denke, die SimpleXML sehr nützlich ist. Und damit benutze ich xpath;

Ich benutze viele XML-Konfigurationen und dies hilft mir, sie wirklich schnell zu parsen. SimpleXml ist auf C geschrieben, so ist es sehr schnell.