Najlepszy Parser XML dla PHP [duplicate]

To pytanie ma już odpowiedź tutaj:

Używałem już wcześniej parsera XML i mimo, że działał OK, nie byłem z niego zadowolony w ogóle, czułem się jakbym używał obejść dla rzeczy, które powinny być podstawową funkcjonalnością.

Ostatnio widziałem SimpleXML ale nie próbowałem jeszcze nie. Czy to coś prostszego? Jakie zalety i wady mają oba? Jakieś inne parsery, których używałeś?

Author: Gras Double, 2008-10-09

6 answers

Muszę powiedzieć SimpleXML bierze tort, ponieważ jest to po pierwsze rozszerzenie, napisane w C, i jest bardzo szybkie. Ale po drugie, przetworzony dokument przyjmuje formę obiektu PHP. Możesz więc "odpytywać" jak $root->myElement.

 93
Author: Robert K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 20:03:16

Spójrz na PHP Dostępne rozszerzenia XML i zobacz http://devzone.zend.com/243/ i http://devzone.zend.com/1035 / do omówienia tych.

Główna różnica między Parserem XML a SimpleXML polega na tym, że ten ostatni nie jest parserem pull. SimpleXML jest zbudowany na bazie rozszerzeń DOM i załaduje cały plik XML do pamięci. Parser XML, taki jak XMLReader, załaduje tylko bieżący węzeł do pamięci. Definiujesz programy obsługi dla konkretnych węzłów, które zostanie uruchomiony, gdy Parser napotka go. To jest szybsze i oszczędza pamięć. Płacisz za to nie będąc w stanie korzystać z XPath.

Osobiście uważam SimpleXml za dość ograniczający (stąd prosty) w tym, co oferuje ponad DOM. Możesz łatwo przełączać się między DOM i SimpleXml, ale zwykle nie przejmuję się i idę drogą DOM bezpośrednio. DOM jest implementacją W3C DOM API, więc możesz być zaznajomiony z nim z innych języków, na przykład JavaScript.

 38
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 13:10:08

Jest to przydatna funkcja do szybkiego i łatwego parsowania xml, gdy rozszerzenie nie jest dostępne:

<?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;
}
?>
 22
Author: NexusRex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 08:38:01

Witam myślę, że SimpleXml jest bardzo przydatny . A wraz z nim używam 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

Używam wielu XML configów i to pomaga mi parsować je naprawdę szybko. SimpleXml jest napisane na C więc jest bardzo szybki.

 14
Author: Vahan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 07:36:44

To zależy od tego, co próbujesz zrobić z plikami XML. Jeśli próbujesz tylko odczytać plik XML (jak plik konfiguracyjny), Wicked Flea ma rację sugerując SimpleXML, ponieważ tworzy to, co odpowiada zagnieżdżonym obiektom ArrayObjects. np. wartość będzie dostępna przez $xml - > root - > child.

Jeśli chcesz manipulować plikami XML, prawdopodobnie najlepiej będzie użyć DOM XML

 11
Author: dcousineau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 07:34:04

Parser crxml jest naprawdę łatwy do parsera.

Ta klasa ma funkcję wyszukiwania, która przyjmuje nazwę węzła z dowolną przestrzenią nazw jako argument. Przeszukuje xml w poszukiwaniu węzła i wyświetla instrukcję access, aby uzyskać dostęp do tego węzła przy użyciu tej klasy. Ta klasa sprawia również, że generowanie xml jest bardzo łatwe.

Możesz pobrać tę klasę na

Http://freshmeat.net/projects/crxml

Lub od phpclasses.org

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

 0
Author: Sandeep.C.R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-11 16:01:51