Лучший XML-парсер для PHP

Раньше я использовал XML Parser, и хотя он работал нормально, в целом он меня не устраивал, мне казалось, что я использую обходные пути для вещей, которые должны быть базовой функциональностью.

Недавно я видел SimpleXML, но еще не пробовал. Это проще? Какие преимущества и недостатки есть у обоих? Какие еще парсеры вы использовали?

Предложение для всех, кто это читает: задайте вопрос, описывающий, что вам нужно для делать с XML (помимо простого его анализа), и вы, вероятно, получите гораздо лучший ответ.

Shog9 12.03.2013 03:39

См. Следующий общий справочный вопрос по тегу PHP: Как анализировать и обрабатывать HTML / XML с помощью PHP?

hakre 20.03.2013 19:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
149
2
189 497
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Я бы сказал, что SimpleXML занимает первое место, потому что это, во-первых, расширение, написанное на C, и оно очень быстрое. Но во-вторых, проанализированный документ принимает форму объекта PHP. Таким образом, вы можете «запросить» как $root->myElement.

simplexml - лучший вариант. Но работать с пространствами имен не так хорошо, иногда это может быть сложно

pleasedontbelong 01.09.2010 12:09

Да, я тоже думаю, что это лучше. И я использую с ним xpath. $ xml-> xpath ("// block"); // ЭТО СУПЕР :)

Vahan 23.03.2012 00:15

Я не думаю, что это лучший вариант. Он не поддерживает xml version = "1.1" и выдает предупреждение об этом факте (моя версия PHP - 5.3.6). Я знаю, что вы можете отключить предупреждения, и все работает нормально, но я не думаю, что это хорошее решение. Итак, представьте, что произойдет, если ваш провайдер API изменит версию xml-документа с 1.0 на 1.1? Вторая мысль - это то, что указал @Gordon. SimpleXML загружает весь документ в память. Это хорошее решение, но, конечно, не лучшее.

Karol 12.04.2012 14:40

Работа с XML с пространством имен с помощью SimpleXML - отстой.

Jake Wilson 12.10.2012 23:53

SimpleXML создает другую структуру, когда у некоторого узла один дочерний элемент, и другую, когда у него больше дочерних узлов. Меня тошнит от этого!

Adam Pietrasiak 01.02.2015 12:15

Не используйте SimpleXml, если в будущем вам может потребоваться изменить XML. Я видел полученный код ... зрелище не очень красивое.

Bet Lamed 14.12.2015 18:26

@BetLamed В настоящее время я согласен, но если вы пытались написать парсер с DOMDocument, вам придется в 10 раз больше кода и много сложностей.

Robert K 14.12.2015 23:52

@ jake-wilson Это SimpleXML - ключ к разгадке в названии

jim smith 13.03.2017 14:49

Альтернативы @BetLamed?

agoldev 19.09.2019 16:19

@agoldev Извините, я не помню, я написал это 4 года назад. В проекте, над которым я работал, я думаю, что в конечном итоге я использовал SimpleXML и кодировал проблемы, потому что его изменение было бы слишком большим трудом ...

Bet Lamed 20.09.2019 11:56

Это зависит от того, что вы пытаетесь сделать с файлами XML. Если вы просто пытаетесь прочитать файл XML (например, файл конфигурации), Wicked Flea правильно предлагает SimpleXML, поскольку он создает то, что составляет вложенные объекты ArrayObject. например значение будет доступно $ xml-> root-> child.

Если вы хотите манипулировать файлами XML, вам, вероятно, лучше всего использовать DOM XML

Взгляните на PHP доступные расширения XML.

Основное различие между XML Parser и SimpleXML заключается в том, что последний не является анализатором pull. SimpleXML построен на основе расширений DOM и загружает в память весь XML-файл. XML Parser, такой как XMLReader, загружает в память только текущий узел. Вы определяете обработчики для определенных узлов, которые будут срабатывать, когда синтаксический анализатор обнаруживает их. Это быстрее и экономит память. Вы платите за это тем, что не можете использовать XPath.

Лично я считаю SimpleXml довольно ограничивающим (а значит, простым) в том, что он предлагает поверх DOM. Вы можете легко переключаться между DOM и SimpleXml, но я обычно не беспокоюсь и иду по маршруту DOM напрямую. DOM - это реализация W3C DOM API, поэтому вы, возможно, знакомы с ним по другим языкам, например по JavaScript.

так что ты используешь в основном?

Pratik 14.02.2019 13:48

Извините - просто искал информацию о различиях в API и пришел сюда. Обе ссылки devzone мертвы и не уверены, нужно ли их удалять или обновлять.

Nigel Ren 11.06.2020 11:33

Это полезная функция для быстрого и простого разбора xml, когда расширение недоступно:

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

работал как шарм, где simpleXml не удался в паре скриптов, над которыми я работаю, спасибо

Elvis Ciotti 02.01.2017 14:27

получение ошибки - Примечание: неопределенная переменная: xml_array?

shfkktm 03.03.2017 11:00

спасибо, это решит мою проблему с simpleXml!

Vilk 26.08.2019 21:50

синтаксический анализатор crxml действительно прост в синтаксическом анализе.

В этом классе есть функция поиска, которая принимает в качестве аргумента имя узла с любым пространством имен. Он ищет узел в xml и распечатывает инструкцию доступа для доступа к этому узлу с помощью этого класса. Этот класс также упрощает создание xml.

вы можете скачать этот класс на

http://freshmeat.net/projects/crxml

или с phpclasses.org

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

Возможно, вы захотите сообщить, что являетесь автором этого класса.

Brad Larson 10.03.2014 01:02

PHPClasses.org все еще актуален? Обновлено: О, я думаю, это было еще в 11-м году.

Phillip Harrington 27.10.2016 00:08

Привет, я думаю, что SimpleXml очень полезен. И с ним я использую 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

Я использую много конфигураций xml, и это помогает мне очень быстро их разбирать. SimpleXml написан на C, поэтому он очень быстрый.

Другие вопросы по теме