最好的XMLparsing器的PHP
我以前使用过XMLparsing器,即使它工作正常,但我一般不满意,感觉就像我正在使用应该是基本function的解决方法。
我最近看到SimpleXML,但我还没有尝试过。 这是更简单吗? 两者有什么优点和缺点? 你使用过的其他parsing器?
我不得不说, SimpleXML的蛋糕,因为它首先是一个扩展,写在C,并且非常快。 但其次,parsing的文档采取PHP对象的forms。 所以你可以“查询”像$root->myElement
。
查看PHP的可用XML扩展,并查看http://devzone.zend.com/243/和http://devzone.zend.com/1035/以获取有关这些扩展的讨论。;
XMLparsing器和SimpleXML的主要区别在于后者不是拉parsing器。 SimpleXML构build在DOM扩展之上,并将整个XML文件加载到内存中。 像XMLReader这样的XMLparsing器只会将当前节点加载到内存中。 您可以为parsing器遇到的特定节点定义处理程序。 这是更快,节省内存。 您不能使用XPath来付钱。
就我个人而言,我发现SimpleXml相对于DOM提供的限制(因此很简单)。 尽pipe你可以很容易地在DOM和SimpleXml之间切换,但是我通常不打扰并直接进入DOM路由。 DOM是W3C DOM API的一个实现,所以你可能对其他语言比如JavaScript很熟悉。
当扩展不可用时,这是一个快速简单的xmlparsing的有用function:
<?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
我使用了许多XMLconfiguration,这有助于我真正快速地parsing它们。 SimpleXml
写在C
所以速度非常快。
这取决于你想用XML文件做什么。 如果你只是想读取XML文件(比如configuration文件),The Wicked Fleabuild议使用SimpleXML,因为它创build了嵌套的ArrayObjects。 例如,值可以通过$ xml-> root-> child来访问。
如果您正在操纵XML文件,那么最好使用DOM XML
crxmlparsing器是一个真正的parsing器。
这个类有一个searchfunction,它将一个名称空间的节点名称作为参数。 它在xml中search节点,并打印出访问语句以使用此类访问该节点。 这个类也使xml生成非常容易。
你可以在这个类下载
http://freshmeat.net/projects/crxml
或从phpclasses.org
http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html