我以前使用过XML解析器,虽然它工作得还可以,但总体上我并不满意它,感觉我在使用它时需要使用一些绕道解决的方式来实现本应该是基本功能的东西。
我最近看到了SimpleXML,但还没有试过。它更简单吗?两者有什么优缺点?你使用过其他解析器吗?
我以前使用过XML解析器,虽然它工作得还可以,但总体上我并不满意它,感觉我在使用它时需要使用一些绕道解决的方式来实现本应该是基本功能的东西。
我最近看到了SimpleXML,但还没有试过。它更简单吗?两者有什么优缺点?你使用过其他解析器吗?
我必须说 SimpleXML 是最好的选择,因为它是一个用C语言编写的扩展,并且非常快。其次,解析后的文档采用了PHP对象的形式。因此,您可以像这样“查询”:$root->myElement
。
请查看PHP的可用XML扩展。
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;
}
?>
嗨,我认为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
编写的,因此非常快速。
这取决于您想要对XML文件做什么。如果您只是想读取XML文件(比如配置文件),那么The Wicked Flea建议使用SimpleXML是正确的,因为它创建了类似嵌套ArrayObjects的内容结构。例如,可以通过 $xml->root->child 访问值。
如果您想要操作XML文件,最好使用DOM XML。
crxml解析器是一个非常易于使用的解析器。
该类具有搜索功能,可以将任何命名空间的节点名称作为参数。它会在xml中搜索该节点,并打印出使用此类访问该节点的访问语句。此类还使xml生成变得非常容易。
您可以在以下网址下载此类:
http://freshmeat.net/projects/crxml
或者从phpclasses.org获取
http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html