PHP的最佳XML解析器

Best XML Parser for PHP

本问题已经有最佳答案,请猛点这里访问。

我以前使用过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文件加载到内存中。像xmlreader这样的XML解析器将只将当前节点加载到内存中。您为特定节点定义处理程序,当解析器遇到它时,这些节点将被触发。速度更快,节省了内存。您为此付出代价,却无法使用xpath。

就我个人而言,我发现simpleXML在它提供的内容相对于DOM非常有限(因此很简单)。不过,您可以很容易地在dom和simplexml之间进行切换,但我通常不必费心直接执行dom路由。dom是W3CdomAPI的一个实现,因此您可能对它熟悉其他语言,例如javascript。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?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;

1
2
3
4
$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中搜索该节点,并打印出访问语句以使用此类访问该节点。这个类还使XML生成非常容易。

你可以在下载这个课程

http://newheat.net/projects/crxml

或从phpclasses.org

http://www.phpclasses.org/package/6769-php-maniple-xml-documents-as-array.html