Возможный дубликат:
Лучший XML-парсер для PHP
У меня есть строка с данными XML. Как его разобрать на PHP?
Спасибо
Попробуйте простой XML , вот пример:
do.php:
<?php $xml_str = file_get_contents('xmlfile.xml'); $xml = new SimpleXMLElement($xml_str); $items = $xml->xpath('*/item'); foreach($items as $item) { echo $item['title'], ': ', $item['description'], "\n"; }
XMLFile.xml:
<?xml version="1.0" encoding="UTF-8"?> <xml> <items> <item title="Hello World" description="Hellowing the world.." /> <item title="Hello People" description="greeting people.." /> </items> </xml>
В тех ситуациях, когда SimpleXML недоступен, я использую эту функцию, первоначально опубликованную в комментарии на php.net. Он отлично работает в 99% случаев.
<?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; } ?>
Если вы знакомы с Zend Framework, передайте XML в Zend_Config_Xml
данный xml как это
$myXml = ' <?xml version="1.0" ?> <top> <var>value</var> <nested> <var>value</var> </nested> <arrayVar> <item>1</item> <item>2</item> <item>3</item> </arrayVar> </top>';
Вы можете получить к нему доступ таким образом:
$xml = new Zend_Config_Xml( $myXml ); $var = $xml->var; $nestedVar = $xml->nested->var; $arrayVar = $xml->arrayVar->toArray();
Zend Config XML использует simplexml и основывается на этом, чтобы дать приятный интерфейс, что позволяет легко получить доступ к узлу xml, который вы ищете.
В руководстве ZF есть больше нагрузок, включая способы доступа к атрибутам и некоторые другие действительно полезные функции.
http://framework.zend.com/manual/en/zend.config.adapters.xml.html
Zend Config – одна из самых простых в использовании частей ZF, и (я думаю) это автономный компонент, вы можете использовать только Zend Config и никакой другой части ZF