Frage

    

Diese Frage bereits eine Antwort hier:

         

ich den XML-Parser verwendet haben, und obwohl es in Ordnung war, war ich mit ihm im Allgemeinen nicht glücklich, es fühlte sich wie ich war Abhilfen für Dinge verwenden, die grundlegende Funktionalität sein sollte.

Ich sehe SimpleXML vor kurzem, aber ich habe es noch nicht probiert. Ist es einfacher? Welche Vor- und Nachteile haben beide? Alle anderen Parser Sie verwendet haben?

War es hilfreich?

Lösung

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

Andere Tipps

Hier finden Sie aktuelle PHP und finden Sie unter http://devzone.zend.com/243/ und http://devzone.zend.com/1035/ für eine Diskussion von denen.

Der wesentliche Unterschied zwischen XML-Parser und SimpleXML ist, dass letztere nicht ein Pull-Parser ist. SimpleXML ist oben auf den DOM-Erweiterungen gebaut und wird die gesamte XML-Datei in den Speicher laden. XML-Parser wie XMLReader nur den aktuellen Knoten in den Speicher laden. Sie definieren Handler für bestimmte Knoten, die ausgelöst wird erhalten, wenn der Parser es trifft. Das ist schneller und spart Speicher. Sie zahlen für das mit nicht XPath in der Lage zu verwenden.

Ich persönlich finde SimpleXML ganz Begrenzung (daher einfach) in dem, was sie über DOM bietet. Sie können ganz einfach, obwohl zwischen DOM und SimpleXML wechseln, aber ich nicht in der Regel die Mühe und die DOM-Route direkt zu gehen. DOM ist eine Implementierung des W3C-DOM-API, so dass Sie vielleicht mit ihm aus anderen Sprachen, zum Beispiel JavaScript vertraut sein.

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

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

Hallo, ich denke, die SimpleXML sehr nützlich ist. Und damit ich bin mit 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

Ich benutze viele xml configs und das hilft mir sie wirklich schnell zu analysieren. SimpleXml auf C geschrieben, so dass es sehr schnell ist.

Es hängt davon ab, was Sie versuchen, mit den XML-Dateien zu tun. Wenn Sie nur versuchen, die XML-Datei zu lesen (wie eine Konfigurationsdatei), The Wicked Flea ist in was darauf hindeutet, SimpleXML korrekt, da es, wie verschachtelten ArrayObjects schafft beträgt. z.B. Wert von $ xml-> Wurzel-> Kind zugänglich sein.

Wenn Sie schauen, um die XML-Dateien, die Sie sind wahrscheinlich am besten dran mit DOM XML

zu manipulieren

die crxml Parser ist ein wirklich einfach zu Parser.

hat diese Klasse eine Suchfunktion, bekommen die mit jedem Namespace als Argument einen Knotennamen nimmt. Es sucht die XML für den Knoten und druckt die Zugriffsanweisung aus, dass der Knoten für den Zugriff auf diese Klasse. Diese Klasse auch xml Generation macht sehr einfach.

Sie können diese Klasse Download unter

http://freshmeat.net/projects/crxml

oder von phpclasses.org

http: //www.phpclasses. org / Paket / 6769-PHP-manipulieren-XML-Dokumenten-as-array.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top