最佳 PHP XML 解析器 [复制]

Best XML Parser for PHP [duplicate]

提问人:Murat Ayfer 提问时间:10/10/2008 最后编辑:Gras DoubleMurat Ayfer 更新时间:6/12/2020 访问量:201044

问:

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

我最近看到了 SimpleXML,但我还没有尝试过。它更简单吗?两者有什么优点和缺点?你用过其他解析器吗?

php xml -解析

评论

4赞 Shog9 3/12/2013
给任何读到这篇文章的人的建议是:问一个问题,描述你需要用XML做什么(不仅仅是简单地解析它),你可能会得到一个更好的答案。
2赞 hakre 3/20/2013
请参阅以下PHP标签的一般参考问题:如何使用PHP解析和处理HTML/XML?

答:

110赞 Robert K 10/10/2008 #1

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

评论

14赞 pleasedontbelong 9/1/2010
simplexml 是最好的。但是使用命名空间不是那么好,有时可能会变得棘手
2赞 Vahan 3/23/2012
是的,我认为这也是最好的。我用xpath。$xml->xpath(“//block”);//这是超级:)
5赞 Karol 4/12/2012
我不认为这是最好的。它不支持xml version=“1.1”,并抛出有关此事实的警告(我的PHP版本是5.3.6)。我知道您可以禁用警告并且它工作正常,但我认为这不是一个好的解决方案。那么想象一下,如果您的 API 提供商将 xml 文档版本从 1.0 更改为 1.1,会发生什么?第二,思考是@Gordon指出的。SimpleXML 将整个文档加载到内存中。这是一个很好的解决方案,但肯定不是最好的。
9赞 Jake Wilson 10/13/2012
使用 SimpleXML 处理命名空间的 XML 很糟糕。
4赞 Adam Pietrasiak 2/1/2015
当某个节点有一个子节点时,SimpleXML 会创建不同的结构,而当它有更多子节点时,则会创建不同的结构。这让我恶心!
13赞 dcousineau 10/10/2008 #2

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

如果你想操作XML文件,你最好使用DOM XML

43赞 Gordon 9/1/2010 #3

看看PHP可用的XML扩展

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

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

评论

0赞 Pratik Joshi 2/14/2019
那么你主要使用什么呢?
1赞 Nigel Ren 6/11/2020
对不起 - 只是在寻找有关 API 差异的信息并来到这里。两个 devzone 链接都已失效,不确定是否应该删除或更新它们。
39赞 NexusRex 2/9/2011 #4

这是一个有用的函数,用于在扩展不可用时快速轻松地进行 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;
}
?>

评论

3赞 E Ciotti 1/2/2017
就像一个魅力,simpleXml 在我正在处理的几个脚本中失败了,谢谢
0赞 Shahulktm 3/3/2017
收到错误 - 注意:未定义的变量:xml_array?
2赞 Vilk 8/27/2019
谢谢,这解决了我用simpleXml的问题!
0赞 Sandeep.C.R 9/12/2011 #5

CRXML 解析器是一个非常容易解析的解析器。

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

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

http://freshmeat.net/projects/crxml

或来自 phpclasses.org

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

评论

12赞 Brad Larson 3/10/2014
您可能希望透露您是此类的作者。
0赞 Phillip Harrington 10/27/2016
PHPClasses.org 还是一回事?编辑:哦,我猜它还是回到 11 年
19赞 Vahan 3/23/2012 #6

嗨,我认为 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配置,这有助于我非常快速地解析它们。 写在上面,所以它非常快。SimpleXmlC