Best XML Parser for PHP
我以前使用过XML解析器,尽管它工作正常,但总体上我对它并不满意,我觉得我是在为一些应该是基本功能的事情使用变通方法。
我最近看到SimpleXML,但还没有尝试过。有简单点的吗?两者都有哪些优点和缺点?你还用过其他的解析器吗?
我不得不说simpleXML接受了这一点,因为它首先是一个扩展,用C语言编写,速度非常快。但第二,解析后的文档采用PHP对象的形式。所以你可以像
请查看PHP可用的XML扩展,并参阅http://devzone.zend.com/243/和http://devzone.zend.com/1035/了解这些扩展的讨论。
XML解析器和simpleXML的主要区别在于后者不是pull解析器。SimpleXML构建在DOM扩展之上,并将整个XML文件加载到内存中。像xmlreader这样的XML解析器将只将当前节点加载到内存中。您为特定节点定义处理程序,当解析器遇到它时,这些节点将被触发。速度更快,节省了内存。您为此付出代价,却无法使用xpath。
就我个人而言,我发现simpleXML在它提供的内容相对于DOM非常有限(因此很简单)。不过,您可以很容易地在dom和simplexml之间进行切换,但我通常不必费心直接执行dom路由。dom是W3CdomAPI的一个实现,因此您可能对它熟悉其他语言,例如javascript。
当扩展不可用时,这是一个很有用的函数,用于快速和轻松地进行XML解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | <?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;
1 2 3 4 | $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配置,这可以帮助我快速解析它们。
这取决于您试图对XML文件做什么。如果您只是试图读取XML文件(如配置文件),那么邪恶的跳蚤在建议simpleXML时是正确的,因为它创建了相当于嵌套的ArrayObjects的内容。例如,$xml->root->child可以访问值。
如果要操作XML文件,最好使用dom xml
CRXML解析器是一个真正容易解析的解析器。
这个类有一个搜索函数,它使用一个具有任何名称空间的节点名作为参数。它在XML中搜索该节点,并打印出访问语句以使用此类访问该节点。这个类还使XML生成非常容易。
你可以在下载这个课程
http://newheat.net/projects/crxml
或从phpclasses.org
http://www.phpclasses.org/package/6769-php-maniple-xml-documents-as-array.html