149

我以前使用过 XML Parser,尽管它工作正常,但我对它总体上并不满意,感觉就像我在为应该是基本功能的事情使用变通方法。

我最近看到了 SimpleXML,但我还没有尝试过。是不是更简单了?两者都有什么优点和缺点?您使用过任何其他解析器吗?

4

6 回答 6

107

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

于 2008-10-09T18:06:53.497 回答
42

查看 PHP 的可用 XML 扩展

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

就我个人而言,我发现 SimpleXml 在它通过 DOM 提供的功能方面非常有限(因此很简单)。您可以轻松地在 DOM 和 SimpleXml 之间切换,但我通常不会打扰,直接走 DOM 路线。DOM 是 W3C DOM API 的实现,因此您可能从其他语言(例如 JavaScript)熟悉它。

于 2010-09-01T07:59:28.530 回答
35

这是一个有用的功能,可以在扩展不可用时快速轻松地解析 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;
}
?>
于 2011-02-09T08:38:01.520 回答
20

嗨,我认为 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所以速度非常快。

于 2012-03-22T20:19:17.340 回答
13

这取决于您尝试对 XML 文件执行的操作。如果您只是想读取 XML 文件(如配置文件),The Wicked Flea 建议 SimpleXML 是正确的,因为它创建了相当于嵌套 ArrayObjects 的内容。例如,值可以通过 $xml->root->child 访问。

如果您正在寻找操作 XML 文件,您可能最好使用DOM XML

于 2008-10-10T07:34:04.880 回答
0

crxml 解析器是一个真正易于解析的解析器。

这个类有一个搜索功能,它接受一个带有任何命名空间的节点名称作为参数。它在 xml 中搜索节点并打印出访问语句以使用此类访问该节点。这个类还使生成 xml 变得非常容易。

你可以下载这个课程

http://freshmeat.net/projects/crxml

或来自 phpclasses.org

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

于 2011-09-11T16:01:51.410 回答