Раньше я использовал XML Parser, и даже несмотря на то, что он работал нормально, я был недоволен этим в целом, мне показалось, что я использовал обходные пути для вещей, которые должны быть базовой функциональностью.
Недавно я видел SimpleXML, но я еще не пробовал. Это проще? Какие преимущества и недостатки имеют оба? Какие-либо другие парсеры, которые вы использовали?
Я должен сказать, что SimpleXML берет торт, потому что это, во-первых, расширение, написанное на C, и очень быстро. Но во-вторых, анализируемый документ принимает форму объекта PHP. Таким образом, вы можете «запросить», как $root->myElement
.
Посмотрите доступные XML-расширения PHP и см. http://devzone.zend.com/243/ и http://devzone.zend.com/1035/ для обсуждения этих вопросов.
Основное различие между XML Parser и SimpleXML заключается в том, что последний не является парсером pull. SimpleXML построен поверх расширений DOM и загружает весь XML-файл в память. XML-анализатор, подобный XMLReader, будет загружать только текущий узел в память. Вы определяете обработчики для определенных узлов, которые будут срабатывать при обнаружении Parser. Это быстрее и экономит память. Вы платите за это, не имея возможности использовать 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