Вопрос

На этот вопрос уже есть ответ здесь:

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

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

Это было полезно?

Решение

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

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

Взгляните на PHP доступные расширения XML и увидеть http://devzone.zend.com/243/ и http://devzone.zend.com/1035/ для обсуждения этих вопросов.

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

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

Это полезная функция для быстрого и удобного синтаксического анализа 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 очень полезен .И с его помощью я использую 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 так что это очень быстро.

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

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

анализатор crxml - это действительно простой в использовании анализатор.

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

вы можете скачать этот класс по адресу

http://freshmeat.net/projects/crxml

или от phpclasses.org

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top