У меня есть объединенный xml с корневым элементом и несколькими дочерними элементами элемента. Что-то вроде этого
<root> <item>test1</item> <item>test2</item> </root>
То, что я хочу, – это простой способ разобрать xml и создать массив строк xml из элементов.
$arrXml[0] = '<item>test1</item>'; $arrXml[1] = '<item>test2</item>';
Я ищу элегантное решение, а не любое решение.
Хорошо, как уже упоминалось в комментариях к вашему вопросу, я не уверен, что это действительно то, что вы должны делать , но поскольку я не могу утверждать 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);