Разделить XML в PHP

У меня есть объединенный xml с корневым элементом и несколькими дочерними элементами элемента. Что-то вроде этого

<root> <item>test1</item> <item>test2</item> </root> 

То, что я хочу, – это простой способ разобрать xml и создать массив строк xml из элементов.

 $arrXml[0] = '<item>test1</item>'; $arrXml[1] = '<item>test2</item>'; 

Я ищу элегантное решение, а не любое решение.

Solutions Collecting From Web of "Разделить XML в PHP"

Хорошо, как уже упоминалось в комментариях к вашему вопросу, я не уверен, что это действительно то, что вы должны делать , но поскольку я не могу утверждать SimpleXml и не хочу, чтобы люди думали, что это единственный способ, вот как это сделать

с DOM :

 $arrXml = array(); $dom = new DOMDocument; $dom->loadXML( $xml ); foreach( $dom->getElementsByTagName( 'item' ) as $item ) { $arrXml[] = $dom->saveXML( $item ); } print_r( $arrXml ); 

с XMLReader :

 $arrXml = array(); $reader = new XmlReader; $reader->xml( $xml ); while( $reader->read() ) { if( $reader->localName === 'item' && $reader->nodeType === 1 ) { $arrXml[] = $reader->readOuterXml(); } } print_r( $arrXml ); 

и XMLParser* :

 xml_parse_into_struct(xml_parser_create(), $xml, $nodes); $xmlArr = array(); foreach($nodes as $node) { if($node['tag'] === 'ITEM') { $arrXml[] = "<item>{$node['value']}</item>"; } } print_r($arrXml); 

* это также можно выполнить с помощью обратных вызовов, вызванных, когда встречается элемент ITEM. Будет больше кода, но он довольно гибкий.

Обратите внимание, что все вышеперечисленное может потребовать некоторой настройки в зависимости от вашего реального XML.


Учитывая, что XML в вашем вопросе (который, скорее всего, является лишь примером), является простой и понятной в использовании, вы также можете использовать explode() :

 $arrXml = array_map( 'trim', array_filter( explode( PHP_EOL, $xml ), function( $line ) { return substr( $line, 0, 6 ) === '<item>'; } )); print_r( $arrXml ); 

или Regex (прочитайте заявление об отказе от ответственности ниже)

 preg_match_all('#<item>.*</item>#', $xml, $arrXml); print_r($arrXml[0]); 

Отказ от ответственности Теперь, чтобы убедиться, что вы не начинаете регулярно анализировать XML с регулярным выражением или Explode: последние два подхода возможны только в том случае, если ваша разметка действительно четко определена, как вы ее показываете.

В комментариях страницы руководства SimpleXml есть несколько хороших примеров кода. Уверен, что вы можете что-то сделать из образца objectsIntoArray() .

Вы посмотрели на SimpleXML ?

Например:

 $string = " <root> <item>test1</item> <item>test2</item> </root> "; $xml = simplexml_load_string($string);