PHP最佳XML解析器

PHP最佳XML解析器,php,xml,parsing,xml-parsing,Php,Xml,Parsing,Xml Parsing,我以前使用过XML解析器,尽管它工作正常,但总体上我并不满意,它让我觉得我在使用变通方法来解决一些应该是基本功能的问题 我最近看到了SimpleXML,但还没有尝试过。这更简单吗?两者都有哪些优点和缺点?您还使用过其他解析器吗?我不得不说,它是一个扩展,首先是用C编写的,速度非常快。但第二,解析后的文档采用PHP对象的形式。因此,您可以像$root->myElement这样“查询”,这取决于您试图对XML文件执行的操作。如果您只是尝试读取XML文件(如配置文件),那么这个恶毒的跳蚤建议Simpl

我以前使用过XML解析器,尽管它工作正常,但总体上我并不满意,它让我觉得我在使用变通方法来解决一些应该是基本功能的问题


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

我不得不说,它是一个扩展,首先是用C编写的,速度非常快。但第二,解析后的文档采用PHP对象的形式。因此,您可以像
$root->myElement

这样“查询”,这取决于您试图对XML文件执行的操作。如果您只是尝试读取XML文件(如配置文件),那么这个恶毒的跳蚤建议SimpleXML是正确的,因为它创建了相当于嵌套ArrayObject的内容。e、 g.值可通过$xml->root->child访问

如果您希望操作XML文件,最好使用PHP

XML解析器和SimpleXML之间的主要区别在于后者不是拉式解析器。SimpleXML构建在DOM扩展之上,将整个XML文件加载到内存中。像XMLReader这样的XML解析器只会将当前节点加载到内存中。您可以为特定节点定义处理程序,当解析器遇到这些节点时,这些节点将被触发。这样更快,节省内存。为此付出的代价是不能使用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;
}
?>
$value){
$php_stmt_att=$php_stmt.[$x_标记]'。$add.[$key]=$value;';
评估($php\u stmt\u att);
}
}
}
返回$xml_数组;
}
?>

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

该类具有一个搜索函数,该函数将带有任何命名空间的节点名作为参数。它在xml中搜索节点,并打印access语句以使用此类访问该节点。这个类还使xml生成非常容易

您可以在以下位置下载此课程:

或从phpclasses.org


嗨,我认为SimpleXml非常有用。 我用它

$xml=simplexml\u load\u文件(“som\u xml.xml”);
$blocks=$xml->xpath('//block')//获取所有标记
$blocks2=$xml->xpath('//layout/block')//获取所有父标记
我使用了许多xml配置,这有助于我快速解析它们。
SimpleXml
是在
C
上编写的,因此速度非常快。

SimpleXml是最好的。但是使用名称空间不是很好,有时会变得棘手是的,我认为这也是最好的。我使用xpath$xml->xpath(“//块”)//这是超级:)我不认为它是最好的。它不支持xml version=“1.1”,并对这一事实发出警告(我的PHP版本是5.3.6)。我知道你可以禁用警告,它工作得很好,但我认为这不是一个好的解决方案。所以想象一下,如果API提供者将xml文档版本从1.0更改为1.1,将会发生什么?第二个想法是@Gordon指出的。SimpleXML将整个文档加载到内存中。这是一个很好的解决方案,但肯定不是最好的。使用SimpleXML处理带名称空间的XML很糟糕。当某个节点有一个子节点时,SimpleXML会创建不同的结构,而当它有更多子节点时,会创建不同的结构。这让我恶心!对阅读本文的人的建议:提出一个问题,描述您需要对XML做什么(不仅仅是解析它),您可能会得到更好的答案。请参阅以下PHP标签的一般参考问题:您可能想透露您是这个类的作者。PHPClasses.org仍然是一个东西?编辑:哦,我想这还是在11年,当时simpleXml在我正在处理的几个脚本中失败了,谢谢设置错误-注意:未定义变量:xml_数组?thx,这解决了我的simpleXml问题!那么您主要使用什么呢?抱歉-只是想了解API之间的差异,然后来到这里。两个devzone链接都已失效,不确定是否应删除或更新它们。
$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