首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP的最佳XML解析器

PHP的最佳XML解析器
EN

Stack Overflow用户
提问于 2008-10-09 17:57:07
回答 6查看 195.2K关注 0票数 149

我以前使用过XML解析器,尽管它工作得很好,但总体上我对它并不满意,感觉就像是在为一些本应是基本功能的事情使用变通方法。

我最近看过SimpleXML,但还没试过。有没有更简单的方法?两者有什么优势和劣势?你还用过其他解析器吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-09 18:06:53

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

票数 107
EN

Stack Overflow用户

发布于 2010-09-01 15:59:29

看看PHP的available XML extensions

XML parser和SimpleXML之间的主要区别是后者不是拉式解析器。SimpleXML构建在DOM扩展之上,并将整个XML文件加载到内存中。像XMLReader这样的XML Parser只会将当前节点加载到内存中。您可以为特定节点定义处理程序,当解析器遇到它时将触发这些处理程序。这样做速度更快,并且节省了内存。你为此付出的代价是不能使用XPath。

就我个人而言,我发现SimpleXml相对于DOM提供的功能非常有限(因此很简单)。您可以很容易地在DOM和SimpleXml之间进行切换,但我通常不会费心直接使用DOM。DOM是W3C DOM的一种实现,因此您可能从其他语言(例如JavaScript )中熟悉它。

票数 42
EN

Stack Overflow用户

发布于 2011-02-09 16:38:02

这是一个有用的函数,可用于在扩展不可用时快速轻松地进行xml解析:

代码语言:javascript
复制
<?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;
}
?>
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/188414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档