最适合PHP的XML解析器

这个问题在这里已经有了答案:

  • 如何解析和处理PHP中的HTML / XML? 28个答案

  • 我不得不说,SimpleXML需要蛋糕,因为它首先是一个扩展,用C编写,速度非常快。 但其次,解析后的文档采用PHP对象的形式。 所以你可以像“ $root->myElement$root->myElement ”一样“查询”。


    查看PHP的可用XML扩展,并参阅http://devzone.zend.com/243/和http://devzone.zend.com/1035/以获得有关这些扩展的讨论。

    XML解析器和SimpleXML的主要区别在于后者不是拉解析器。 SimpleXML构建在DOM扩展之上,并将整个XML文件加载到内存中。 像XMLReader这样的XML解析器只会将当前节点加载到内存中。 您可以为Parser遇到的特定节点定义处理程序,这些处理程序会被触发。 这是更快,并节省内存。 您无法使用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;
    }
    ?>
    
    链接地址: http://www.djcxy.com/p/29887.html

    上一篇: Best XML Parser for PHP

    下一篇: Only Match Words That Are Outside of Certain Tags (Regex