Во-первых, я новичок php. Я рассмотрел вопрос и решение здесь . Тем не менее, для моих потребностей разбор не углубляется в различные статьи.
Небольшая выборка моего rss-канала читается следующим образом:
<channel> <atom:link href="http://mywebsite.com/rss" rel="self" type="application/rss+xml" /> <title>My Web Site</title> <description>My Feed</description> <link>http://mywebsite.com/</link> <image> <url>http://mywebsite.com/views/images/banner.jpg</url> <title>My Title</title> <link>http://mywebsite.com/</link> <description>Visit My Site</description> </image> <item> <title>Article One</title> <guid isPermaLink="true">http://mywebsite.com/details/e8c5106</guid> <link>http://mywebsite.com/geturl/e8c5106</link> <comments>http://mywebsite.com/details/e8c5106#comments</comments> <pubDate>Wed, 09 Jan 2013 02:59:45 -0500</pubDate> <category>Category 1</category> <description> <![CDATA[<div> <img src="http://mywebsite.com/myimages/1521197-main.jpg" width="120" border="0" /> <ul><li>Poster: someone's name;</li> <li>PostDate: Tue, 08 Jan 2013 21:49:35 -0500</li> <li>Rating: 5</li> <li>Summary:Lorem ipsum dolor </li></ul></div><div style="clear:both;">]]> </description> </item> <item>..
Связи изображений, которые я хочу разобрать, – это путь внутри каждого элемента > Описание
Код в моем файле php гласит:
<?php $xml = simplexml_load_file('http://mywebsite.com/rss?t=2040&dl=1&i=1&r=ceddfb43483437b1ed08ab8a72cbc3d5'); $imgs = $xml->xpath('/item/description/img'); foreach($imgs as $image) { echo $image->src; } ?>
Может кто-то, пожалуйста, помогите мне выяснить, как настроить php-код выше?
Также очень новичок вопрос … как только я получаю результирующие URL-адреса изображений, как я могу отображать изображения в строке на моем html?
Большое спасибо!!!
Эрнандо
Теги <img>
внутри этого RSS-канала на самом деле не являются элементами XML-документа, в отличие от подсветки синтаксиса на этом сайте – это всего лишь текст внутри элемента <description>
который содержит символы <
и >
.
Строка <![CDATA[
сообщает парсеру XML, что все оттуда до тех пор, пока она не встречается ]]>
должна рассматриваться как необработанная строка, независимо от того, что она содержит. Это полезно для встраивания HTML внутри XML, поскольку HTML-теги не обязательно будут действительными XML. Это эквивалентно экранированию всего HTML (например, с помощью htmlspecialchars
), так что теги <img>
будут выглядеть как <img>
, (Я пошла в более подробную техническую информацию о другом ответе ).
Поэтому для извлечения изображений из RSS требуется два шага: сначала получите текст каждого <description>
, а во-вторых, найдите все теги <img>
в этом тексте.
$xml = simplexml_load_file('http://mywebsite.com/rss?t=2040&dl=1&i=1&r=ceddfb43483437b1ed08ab8a72cbc3d5'); $descriptions = $xml->xpath('//item/description'); foreach ( $descriptions as $description_node ) { // The description may not be valid XML, so use a more forgiving HTML parser mode $description_dom = new DOMDocument(); $description_dom->loadHTML( (string)$description_node ); // Switch back to SimpleXML for readability $description_sxml = simplexml_import_dom( $description_dom ); // Find all images, and extract their 'src' param $imgs = $description_sxml->xpath('//img'); foreach($imgs as $image) { echo (string)$image['src']; } }
У меня нет большого опыта работы с xPath, но вы можете попробовать следующее:
$imgs = $xml->xpath('item//img');
Это выберет все img
элементы, которые находятся внутри item
, независимо от того, есть ли другие элементы между ними. Удаление ведущей косой черты будет искать item
любом месте документа, а не только от корня. В противном случае вам понадобится что-то вроде /rss/channel/item...
Что касается отображения изображений: просто выведите <img>
-tags, за которыми следуют разрывы строк, например:
foreach($imgs as $image) { echo '<img src="' . $image->src . '" /><br />'; }
Предпочтительным способом было бы использовать CSS вместо «-tags», но я думаю, что они проще для начала.