При синтаксическом анализе XML с PHP он показывает только первую запись из файла, а не все - PullRequest
1 голос
/ 04 августа 2011

Ниже мой код:

foreach(simplexml_load_file('http://www.bbc.co.uk/radio1/playlist.xml')->item as $link){
$linked = $link->artist; 
$xml_data = file_get_contents('http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=' . $linked . '&api_key=b25b959554ed76058ac220b7b2e0a026');
$xml = new SimpleXMLElement($xml_data);
foreach($xml->images as $test){
$new = $test->image->sizes->size[4];

echo "<img src='$new'>";

?><br /><?php
}}

?>

Это работает, но отображает только одну запись из многих, показывает первую запись из файла XML. Я хочу, чтобы он отображал все записи.

Что я пытаюсь добиться с помощью этого кода:

У меня есть XML-файл, из которого я получаю имя исполнителя, затем я перечисляю все имена исполнителей и вставляю их в ссылку, которая, следовательно, динамически создается из созданных ими имен исполнителей. Затем я хочу взять динамически созданную ссылку, которая является другим XML-файлом, и проанализировать этот файл, чтобы получить узел размера, который является ссылкой на изображение (изображение принадлежит художнику). Затем я хочу отобразить ссылку на это изображение в тег изображения, который отображает изображение.

Это частично работает, но, как я сказал ранее, отображает только одну запись вместо всех записей в XML-файле.

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Возвращенный XML структурирован следующим образом:

<lfm>
    <images>
        <image>
        <image>
        …
        <image>

Это означает, что вам нужно выполнить итерацию

$xml->images->image

Пример:

$lfm = simplexml_load_file('http://…');
foreach ($lfm->images->image as $image) {
    echo $image->sizes->size[4];
}

Для sidenote,Там нет причин использовать file_get_contents там.Либо используйте simplexml_load_file, либо используйте new SimpleXmlElement('http://…', false, true).И действительно, без обид, но, учитывая, что я уже дал вам почти идентичное решение в комментариях к При извлечении имени исполнителя из файла XML только 1 запись показывает Я настоятельно рекомендую вам попытаться понять, что там происходит вместо этогопросто скопировать и вставить.

2 голосов
/ 04 августа 2011

Проблемы:

  1. Ограничение скорости .Мой комментарий к вопросу:

    Обратите внимание, сколько сетевого трафика вы генерируете при каждом выполнении этого скрипта, и кешируйте соответственно.Вполне возможно, что вы можете быть ограничены по скорости, если вы выполняете слишком часто или слишком много раз в день (а ограничения по ставкам API часто намного ниже, чем можно подумать).

    Даже если выпросто «тестируете», или вы и «несколько других людей» используете это, каждый отдельный запрос делает 40 автоматических запросов к ws.audioscrobbler.com !Они не будут этому радоваться, и, поскольку, похоже, они умны, они запретили этот тип трафика.

    Когда я запускаю этот скрипт, ws.audioscrobbler.com обслуживаетдо первого результата (Исполнитель: Адель), но выдает предупреждения о неудачных запросах по многим последующим запросам, пока не пройдет некоторый период времени, очевидно из-за ограничения скорости.

    Средства правовой защиты:

    1. Проверьте, есть ли у API для ws.audioscrobbler.com запрос для нескольких исполнителей .Это позволит вам получить несколько исполнителей одним запросом.

    2. Создать интерфейс менеджера, который может получать И КЕШИТЬ результаты для одного исполнителя за раз .Затем выполните этот процесс, когда вам нужны обновления и используйте кэшированные результаты в любое другое время.

    Независимо от того, какой метод вы используете, кеш, кеш, кеш!

  2. Неправильный аргумент, предоставленный внутреннему foreach .file_get_contents возвращает строку.Несмотря на то, что содержимое XML, вы не загрузили его в анализатор XML.Вам нужно сделать это, прежде чем вы сможете выполнить итерацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...