PHP的最佳XML解析器

Mur*_*fer 145 php xml parsing xml-parsing

我之前使用过XML Parser,虽然它工作正常,但我对它一般不满意,感觉就像我在使用基本功能的东西时使用变通方法.

我最近看过SimpleXML,但我还没有尝试过.它更简单吗?两者有哪些优点和缺点?你用过的其他任何解析器?

Rob*_*t K 105

我不得不说SimpleXML取得了成功,因为它首先是一个用C语言编写的扩展,并且非常快.但其次,解析后的文档采用PHP对象的形式.所以你可以像"查询"一样$root->myElement.

  • simplexml是最好的.但是使用命名空间并不是很好,有时它会变得棘手 (12认同)
  • 使用SimpleXML处理命名空间XML很糟糕. (7认同)
  • 我认为不是最好的.它不支持xml version ="1.1"并抛出有关此事实的警告(我的PHP版本是5.3.6).我知道你可以禁用警告并且它工作正常,但我不认为这是一个很好的解决方案.那么想象一下,如果您的API提供商将xml文档版本从1.0更改为1.1,会发生什么?第二个想法是@Gordon所指出的.SimpleXML将整个文档加载到内存中.这是很好的解决方案,但肯定不是最好的. (5认同)
  • 是的我认为这也是最好的.我用它来使用xpath.$ xml-> xpath("// block"); //这是超级:) (2认同)
  • 当一个节点有一个子节点时,SimpleXML会创建不同的结构 这让我感到恶心! (2认同)

Gor*_*don 41

查看PHP的可用XML扩展,并参阅http://devzone.zend.com/243/http://devzone.zend.com/1035/进行讨论.

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

就个人而言,我发现SimpleXml在DOM上提供的功能非常有限(因此很简单).你可以轻松地在DOM和SimpleXml之间切换,但我通常不会费心去直接使用DOM路由.DOM是W3C DOM API的一个实现,因此您可能熟悉其他语言,例如JavaScript.


Nex*_*Rex 28

当扩展名不可用时,这是一个非常有用的函数,用于快速简便的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;
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 像魅力一样工作,其中 simpleXml 在我正在处理的几个脚本中失败,谢谢 (3认同)
  • 谢谢,这用 simpleXml 解决了我的问题! (2认同)

Vah*_*han 17

嗨,我认为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
Run Code Online (Sandbox Code Playgroud)

我使用了很多xml配置,这有助于我快速解析它们. SimpleXml是写的,C所以它非常快.


dco*_*eau 12

这取决于您尝试使用XML文件执行的操作.如果您只是尝试读取XML文件(如配置文件),那么Wicked Flea在建议SimpleXML时是正确的,因为它创建的数量相当于嵌套的ArrayObjects.例如,$ xml-> root-> child可以访问value.

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