Как создать переменные из XML-данных в PHP?

Попытался понять это на короткое время, но теперь, когда мне повезло, например, у меня есть внешний XML-документ, например:

<?xml version="1.0" ?> <template> <name>My Template Name</name> <author>John Doe</author> <positions> <position>top-a</position> <position>top-b</position> <position>sidebar-a</position> <position>footer-a</position> </positions> </template> 

Как я могу обработать этот документ для создания таких переменных:

 $top-a = top-a; $top-b = top-b; $sidebar-a = sidebar-a; $footer-a = footer-a 

Если вы не можете превратить их в переменные, как бы вы поместили их в массив?

Любая помощь будет оценена.

Solutions Collecting From Web of "Как создать переменные из XML-данных в PHP?"

С веб-сайта PHP по адресу http://www.php.net/manual/en/function.xml-parse.php :

Ashok dot 893 at gmail dot com 26-апр-2010 05:52 Это очень простой способ преобразования всех применимых объектов в ассоциативный массив. Это работает не только с SimpleXML, но и с любым видом объекта. Вход может быть либо массивом, либо объектом. Эта функция также принимает параметр options как массив индексов, который должен быть исключен в возвращаемом массиве. И имейте в виду, что это возвращает только массив нестатических и доступных переменных объекта, поскольку используется функция get_object_vars ().

 <?php function objectsIntoArray($arrObjData, $arrSkipIndices = array()) { $arrData = array(); // if input is object, convert into array if (is_object($arrObjData)) { $arrObjData = get_object_vars($arrObjData); } if (is_array($arrObjData)) { foreach ($arrObjData as $index => $value) { if (is_object($value) || is_array($value)) { $value = objectsIntoArray($value, $arrSkipIndices); // recursive call } if (in_array($index, $arrSkipIndices)) { continue; } $arrData[$index] = $value; } } return $arrData; } ?> Usage: <?php $xmlUrl = "feed.xml"; // XML feed file/URL $xmlStr = file_get_contents($xmlUrl); $xmlObj = simplexml_load_string($xmlStr); $arrXml = objectsIntoArray($xmlObj); print_r($arrXml); ?> 

Это даст следующий результат:

 Array ( [name] => My Template Name [author] => John Doe [positions] => Array ( [position] => Array ( [0] => top-a [1] => top-b [2] => sidebar-a [3] => footer-a ) ) ) 

Вы хотите встроенный класс Simplexml

Взгляните на SimpleXML:

 http://www.php.net/manual/en/simplexml.examples-basic.php 

Он анализирует XML в виде «карты», который затем можно использовать для доступа к вашему контенту. Для вашего конкретного случая,

 $xml = new SimpleXMLElement($xmlstr); $top_a = $xml->template->positions[0] 

Самый простой способ – использовать SimpleXML :

 $xml = simplexml_load_string(... your xml here...); $values = array() foreach($xml->positions as $pos) { $values[$pos] = $pos; } 

Вы не хотите автоматически создавать переменные так, как вы предлагаете, – это помещает ваше пространство имен переменных в мусор. Подумайте, что произойдет, если кто-то отправит через фрагмент XML, который имеет <position>_SERVER</position> и вы создаете переменную этого имени – идет ваш супер-лоб. $ _SERVER.

почему бы не сделать массив напрямую?

 var positions = document.getElementsByTagName("positions"); var positions_final_arr = []; for(int i = 0; i < positions.length; i++){ positions_final_arr[i] = []; var inner_pos = positions[i].getElementsbyTagName("position"); for(int l = 0; l < inner_pos.length; l++){ positions_final_arr[i][l] = inner_pos[i].value; } } console.log(positions_final_arr); 

 $str = "your xml"; $xml = simplexml_load_string($str); $result = array(); foreach ($xml->positions as $pos) { foreach ($pos->position as $p) { $element = (string)$p[0]; $result[$element] = $element; } } var_dump($result); 

Используйте SimpleXML для анализа файла в структуре объекта / массива, а затем просто используйте list :

 $sxml = new SimpleXMLElement($xml); $positions = (array)$sxml->positions->children(); list($top_a, $top_b, $sidebar_a, $footer_a) = $positions['position']; 
 $dom = new DOMDocument; $dom->loadXML('<root><position>a</position></root>'); //your string here //$dom->loadXML(file_get_contents($file_with_pxml)); - from file $position = $dom->getElementsByTagName('position'); for ($i=0; $i<$position->length; $i++) { $item = $position->item($i); ${$item->nodeValue} = $item->nodeValue;//$$item->nodeValue = $item->nodeValue; } 

Но, как я знаю, вы не можете создать переменную с тире в имени в PHP

 <?php $xmlUrl = "feed.xml"; // XML feed file/URL $xmlStr = file_get_contents($xmlUrl); $xmlObj = simplexml_load_string($xmlStr); $arrXml = json_decode(json_encode($xmlObj), true); # the magic!!! print_r($arrXml); ?> 

Это даст следующий результат:

 Array ( [name] => My Template Name [author] => John Doe [positions] => Array ( [position] => Array ( [0] => top-a [1] => top-b [2] => sidebar-a [3] => footer-a ) ) )