Хорошо, как уже упоминалось в комментариях к вашему вопросу Я не уверен, что это действительно то, что вы должны делать, но так как я не могу утверждать 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);
* это также может быть сделано с помощью функции обратного вызова срабатывает, когда ЭЛЕМЕНТ элемент встречается. Будет больше кода, но он довольно гибкий.
Обратите внимание, что все перечисленное может потребоваться некоторые настройки в зависимости от вашего реального XML.
Учитывая, что XML в вашем вопросе (который, скорее всего, только в качестве примера) грязь простой и хорошо определены, вы можете также использовать explode()
:
$arrXml = array_map('trim',
array_filter(
explode(PHP_EOL, $xml),
function($line) { return substr($line, 0, 6) === '<item>'; }
));
print_r($arrXml);
или регулярное выражение (читай ниже условия)
preg_match_all('#<item>.*</item>#', $xml, $arrXml);
print_r($arrXml[0]);
Отказ от ответственности Теперь, просто чтобы убедиться, что вы не начинаете анализировать XML с Regex или Expl ода на регулярной основе: последние два подхода возможны только в том случае, если ваша разметка действительно четко определена, как вы ее показываете.
Я не понимаю, как это уместно? У меня есть особая задача с этим конкретным решением. Я не хочу, чтобы картина могла быть изменена. Я считаю, что я был достаточно ясен в требованиях. – danidacar
@user это просто звучит как действительно глупая идея. –
Я не могу поверить, что вы проголосовали за меня за то, что вы не разделили более общую картину, даже если у вас есть опыт в развитии. Я прошу ясно, и мне не нужен моральный урок. Также, если вам действительно нужно знать, что 3-я сторона отправляет большой XML-файл. Мне нужно проанализировать файл и отправить каждому клиенту часть, в которой он нуждается, и как xml. – danidacar