Синтаксический анализ xml с помощью simplexml_load

#php #xml #simplexml

#php #xml #simplexml

Вопрос:

Я пытаюсь проанализировать xml, но у меня возникает проблема при попытке получить URL изображения.

Мой xml:

 <entry>
<title>The Title</title>
<id>http://example.com/post/367327.html</id>
<summary>Some extra text</summary>
<link rel="enclosure" href="http://example.com/photos/f_0px_30px/image687.jpg" type="image/jpeg"  length="" /> 
</entry>
  

Пока я использую приведенный ниже код для извлечения других данных:

 $url = "http://msdssite.com/feeds/xml/myxml.xml";
$xml = simplexml_load_file($url);

foreach($xml->entry as $PRODUCT)
{
$my_title = trim($PRODUCT->title);
$url = trim($PRODUCT->id);
$myimg = $PRODUCT->link;
}
  

Как я могу разобрать href из этого: <link rel="enclosure" href="http://example.com/photos/f_0px_30px/image687.jpg" type="image/jpeg" length="" />

Комментарии:

1. Попробуйте $myimg = (string) $PRODUCT->link->attributes()->href;

Ответ №1:

Поскольку кажется, что ваши записи могут содержать несколько link тегов, вам нужно проверить, что type атрибут имеет значение image/jpeg , чтобы быть уверенным в получении ссылки на изображение:

 ini_set("display_errors", "On");

$feedURL = 'http://OLDpost.gr/feeds/xml/category-takhs-xatzhs.xml';

$feed = simplexml_load_file($feedURL);

$results = array();

foreach($feed->entry as $entry) {
    $result = array('title' => (string)$entry->title,
                    'url'   => (string)$entry->id);

    $links = $entry->link;
    foreach ($links as $link) {
        $linkAttr = $link->attributes();
        if (isset($linkAttr['type']) amp;amp; $linkAttr['type']=='image/jpeg') {
            $result['img'] = (string)$linkAttr['href'];
            break;
        }
    }
    $results[] = $result;
}

print_r($results);
  

Обратите внимание, что подобное использование simplexml (цикл foreach для поиска тега good link) не очень удобно. Лучше использовать запрос XPath:

 foreach($feed->entry as $entry) {
   $entry->registerXPathNamespace('e', 'http://www.w3.org/2005/Atom');
   $results[] = array(
     'title' => (string)$entry->title,
     'url'   => (string)$entry->id,
     'img'   => (string)$entry->xpath('e:link[@type="image/jpeg"]/@href')[0][0]
   );
}
  

Комментарии:

1. Да, но как можно отобразить результаты как single? Например, как я могу отображать только URL каждого изображения?

2. @IreneT.: Я решил поместить все в результирующий массив, чтобы быть более чистым и потому, что его удобнее повторно использовать позже, например: echo $results[2]['img']; отображает URL изображения из третьей записи. Но если вам вообще не нужен результирующий массив и вы хотите отобразить только URL изображения, замените $results[].....); на echo (string)$entry->xpath('e:link[@type="image/jpeg"]/@href')[0][0];

Ответ №2:

Если это точный XML, на самом деле нет необходимости в foreach . Попробуйте это:

 $xml = simplexml_load_file($url);

$my_title = (string) $xml->title;
$myimg = (string) $xml->link->attributes()['href']; // 5.4 or above
echo $myimg; // http://example.com/photos/f_0px_30px/image687.jpg
  

Ответ №3:

Попробуйте:

 foreach($xml->entry as $PRODUCT)
{
$my_title = trim($PRODUCT->title[0]);
$url = trim($PRODUCT->id[0]);
$myimg = $PRODUCT->link[0];
}