Я пытаюсь разобрать информацию, которая находится внутри массива. Массив исходит из RSS-канала, который я преобразовал в json. Массив:
<channel>
<item>
<title> Title A </title>
<description> Description A </description>
<stuff url = "google.com" type = "search engine">
</item>
<item>
<title> Title B </title>
<description> Description B </description>
<stuff url = "yahoo.com" type = "old stuff">
</item>
....
</channel>
Я разбираю, используя что-то вроде:
$newsoutput = json_decode(json_encode($the_RSS_Link), TRUE);
foreach ($newsoutput['channel']['item'] as $item) {
echo $item['title'];
echo "<br>";
echo $item['description'];
echo "<br>";
echo $item['stuff']['url'];
echo "<br>";
}
Я могу получить как «название», так и «описание»; но я не могу извлечь значения "url" внутри "материала". Я пробовал различные комбинации без везения
Пожалуйста, порекомендуйте.
Спасибо,
ЧАС.
@Hernandito, ты тоже можешь опубликовать json?
Если содержимое RSS похоже на то, что вы разместили в примере, вам следует анализировать RSS-канал с помощью синтаксического анализатора XML вместо использования функций json_*.
Вот несколько простых примеров использования SimpleXML https://www.php.net/manual/en/simplexml.examples-basic.php
Спасибо, Том... Я буду использовать это для справки.
Предполагая, что у вас есть действительный XML (что вы должны сделать, если это действующая плата за RSS), вы можете использовать синтаксический анализатор SimpleXML:
$xml = '<channel>
<item>
<title> Title A </title>
<description> Description A </description>
<stuff url = "google.com" type = "search engine"/>
</item>
<item>
<title> Title B </title>
<description> Description B </description>
<stuff url = "yahoo.com" type = "old stuff"/>
</item></channel>';
$x = new simplexmlelement($xml);
foreach($x->item as $item){
echo $item->title . ' ' . $item->stuff['url'] . ' ' . $item->stuff['type'] . PHP_EOL;
}
Обратите внимание, что элемент stuff
здесь был изменен, поэтому он закрывается автоматически.
Спасибо за ваш ответ ... Я выбрал решение Матье, приведенное ниже, поскольку оно требовало меньшего количества повторного кодирования по сравнению с тем, что я сделал.
@Hernandito Ладно, для меня это не имеет смысла. Зачем кодировать, чтобы декодировать? В SimpleXML уже есть вся информация.
Это проверенный и рабочий пример, который требует использования simplexml_load_string()
<?php
$raw = <<<XML
<?xml version='1.0'?>
<document>
<channel>
<item>
<title>Title A</title>
<description>Description A</description>
<stuff url = "google.com" type = "search engine"></stuff>
</item>
<item>
<title>Title B</title>
<description>Description B</description>
<stuff url = "yahoo.com" type = "old stuff"></stuff>
</item>
</channel>
</document>
XML;
$xml = simplexml_load_string($raw);
$newsoutput = json_decode(json_encode($xml), true);
foreach ($newsoutput['channel']['item'] as $item) {
echo $item['title'];
echo "<br>\n";
echo $item['description'];
echo "<br>\n";
echo $item['stuff']['@attributes']['url'];
echo "<br>\n";
}
Выход:
Title A<br>
Description A<br>
google.com<br>
Title B<br>
Description B<br>
yahoo.com<br>
Будьте осторожны, XML-документ, который вы нам дали, недействителен, и мне пришлось закрыть тег.
Спасибо, Матье... @attributes - это то, чего мне не хватало. Задача решена! Еще раз спасибо.
Почему json_decode(json_encode
? Почему бы просто не получить к ним доступ через SimpleXML, который уже делает их доступными?
Это так, но нужно было максимально придерживаться исходного кода.
Что вы имеете в виду под "Это делает"?
Имеет смысл избегать двойного кодирования/декодирования json. Извините, если было непонятно!
Я думаю, вам придется обработать этот XML с помощью синтаксического анализатора XML, чтобы получить доступ к атрибутам
stuff