在查看您问题的提要后,它显示每个项目都没有图像元素。因此访问它会给你NULL
一个空字符串(不可见)回显:
foreach ($DOM->entry as $entry) {
echo '<a href="">', htmlspecialchars($entry->title), '</a>', "\n",
'<img src="', $entry->image, '" alt="', htmlspecialchars($entry->title), '" ',
'width="304" height="228">', "\n";
;
}
示例输出显示标题可用,但图像 src 为空:
<a href="">Picadas, Marco Juarez 01-05-13</a>
<img src="" alt="Picadas, Marco Juarez 01-05-13" width="304" height="228">
仔细观察提要本身,结果发现甚至没有任何其他元素包含缩略图,而是内容元素内的HTML 文本。只有在该 HTML 中才有缩略图的尺寸:
<entry>
<title>Picadas, Marco Juarez 01-05-13</title>
<link rel="alternate" type="text/html" href="http://www.flickr.com/photos/osvaldorainero/8709806523/"/>
<id>tag:flickr.com,2005:/photo/8709806523</id>
<published>2013-05-05T15:25:15Z</published>
<updated>2013-05-05T15:25:15Z</updated>
<flickr:date_taken>2013-05-01T15:42:01-08:00</flickr:date_taken>
<dc:date.Taken>2013-05-01T15:42:01-08:00</dc:date.Taken>
<content type="html"> <p><a href="http://www.flickr.com/people/osvaldorainero/">Osvaldo Rainero</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/osvaldorainero/8709806523/" title="Picadas, Marco Juarez 01-05-13"><img src="http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_m.jpg" width="240" height="161" alt="Picadas, Marco Juarez 01-05-13" /></a></p>
</content>
<author>
<name>Osvaldo Rainero</name>
<uri>http://www.flickr.com/people/osvaldorainero/</uri>
<flickr:nsid>91267729@N05</flickr:nsid>
<flickr:buddyicon>http://farm9.staticflickr.com/8107/buddyicons/91267729@N05.jpg?1363607055#91267729@N05</flickr:buddyicon>
</author>
<link rel="enclosure" type="image/jpeg" href="http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_b.jpg"/>
<category term="cars" scheme="http://www.flickr.com/photos/tags/"/>
...
<category term="arrancadas" scheme="http://www.flickr.com/photos/tags/"/>
</entry>
飞涨:
<content type="html"> <p><a href="http://www.flickr.com/people/osvaldorainero/">Osvaldo Rainero</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/osvaldorainero/8709806523/" title="Picadas, Marco Juarez 01-05-13"><img src="http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_m.jpg" width="240" height="161" alt="Picadas, Marco Juarez 01-05-13" /></a></p>
</content>
这是用 XML 编码的 HTML。这是您使用的 simplexml 的一种显示停止器,因为它只能逐字返回 HTML 开箱即用:
echo $entry->content, "\n";
输出(纯文本):
<p><a href="http://www.flickr.com/people/osvaldorainero/">Osvaldo Rainero</a> posted a photo:</p>
<p><a href="http://www.flickr.com/photos/osvaldorainero/8709806523/" title="Picadas, Marco Juarez 01-05-13"><img src="http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_m.jpg" width="240" height="161" alt="Picadas, Marco Juarez 01-05-13" /></a></p>
这是要理解的重要部分:您不仅要解析提要中的 XML,还希望解析XML 元素的节点值内的 HTML。
因此,您需要扩展与 HTML 解析器一起使用的 SimplexmlElement。这很容易做到,因为如果您的 PHP 版本附带 simplexml,它还附带具有 HTML 解析器的 DOMDocument,它可以将解析结果作为 simplexml 返回,因此非常兼容。
因此,以下使用 HTML 解析器扩展了 simplexml:
class HtmledSimpleXML extends SimpleXMLElement
{
/**
* Parses element content as HTML and returns the
* body element of it.
*
* @param string $xpath (optional) specify a different element to return
*
* @return SimpleXMLElement
*/
public function html($xpath = '//body') {
$doc = new DOMDocument();
$doc->loadHTML($this);
$xml = simplexml_import_dom($doc->documentElement);
list($body) = $xml->xpath($xpath);
return $body;
}
}
它已经允许传递一个 xpath 查询来指定您要检索的具体元素,通常是body
HTML 内部的标签,这就是为什么它被设置为默认值的原因。即使你的 HTML 中没有那个标签,它实际上存在于 DOM 中,因此这个默认值永远不会出错。但无论如何,在您的情况下,您对 img 标签感兴趣。多亏了 simpelxml,我们甚至可以将其直接输出为 XML,甚至可以手动创建 HTML。
使用示例:
$DOM = new HtmledSimpleXML($body);
foreach ($DOM->entry as $entry) {
echo '<a href="">', $entry->title, '</a>', "\n",
$entry->content->html('//img')->asXML(), "\n";
;
}
单个条目的示例输出是:
<a href="">Picadas, Marco Juarez 01-05-13</a>
<img src="http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_m.jpg" width="240" height="161" alt="Picadas, Marco Juarez 01-05-13"/>
这应该非常接近您正在寻找的东西。当然,您也可以像使用任何其他 Simplexmlelement 一样获取图像元素并访问它的属性:
$thumb = $entry->content->html('//img');
echo 'Title: ', $entry->title, "\n",
'Thumb: ', $thumb['src'], "\n",
'Size : ', $thumb['width'], ' x ', $thumb['height'], "\n";
输出(纯文本):
Title: Picadas, Marco Juarez 01-05-13
Thumb: http://farm9.staticflickr.com/8114/8709806523_3b8d7c0418_m.jpg
Size : 240 x 161
我希望到目前为止这是有帮助的。
上次我在 Stackoverflow 上扩展 SimpleXMLElement 是为了展示如何在PHP simplexml xpath 中解析底层 XML 结构中的 CSV 数据,在包含制表符分隔文本的 ELEMENT 中搜索值?.