PHP 最佳 XML 解析器

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

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

198943 次浏览

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

这取决于您试图对 XML 文件执行什么操作。如果您只是试图读取 XML 文件(比如配置文件) ,那么 WickedFlea 建议使用 SimpleXML 是正确的,因为它创建了相当于嵌套的 ArrayObjects。例如,$xml-> root-> child 可以访问 value。

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

看看 PHP 的 可用的 XML 扩展名

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

就我个人而言,我发现 SimpleXml 在 DOM 上提供的功能非常有限(因此非常简单)。不过,您可以很容易地在 DOM 和 SimpleXml 之间切换,但是我通常不会直接使用 DOM 路由。DOM 是 W3CDOMAPI 的实现,因此您可能熟悉其他语言,例如 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;
}
?>

Crxml 解析器非常容易解析。

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

你可以在

Http://freshmeat.net/projects/crxml

或者来自 phpclasses.org

Http://www.phpclasses.org/package/6769-php-manipulate-xml-documents-as-array.html

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