我正在尝试仅获取在tumblr博客上标记的帖子。我可以根据帖子的类型(常规,链接,照片等)获取每个帖子,但相反,我想让每个帖子上都有一个标签。例如,只获取标记为“文件”的帖子
到目前为止,这是我的代码:
<?php
$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post[@type='photo']");
foreach($posts as $post) {
}
?>
<ul>
<li> <a href="<?php echo $post['url-with-slug']; ?>">Post 1(PHP should be here)</a></li>
</ul>
这里是tumblrs API http://www.tumblr.com/docs/en/api/v2
答案 0 :(得分:3)
首先,您需要在属于foreach
循环的花括号中添加标记。否则,您引用的$post
对象的范围将不可用,并且会给您一个错误。
这就是我提出的:
<ul>
<?php
$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag/..");
foreach($posts as $post) {
echo "
<li>
<a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
</li>
";
}
?>
</ul>
如果您想限制匹配的标签,您可以执行以下操作:
<ul>
<?php
$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
echo "
<li>
<a href='{$post['url-with-slug']}'>".($post->{'regular-title'}?$post->{'regular-title'}:$post->{'link-text'})."</a>
</li>
";
}
?>
</ul>
当然,这有点乱。我不一定是XPath大师,所以应该采用比我想象的更清洁的方式。
由于我没有真正挖掘链接文本的三元组,或者我不知道其中一个或另一个是否总是可用的事实,这应该更具描述性,并回退到URL。 / p>
<ul>
<?php
$xml = simplexml_load_file('http://stocklamp.tumblr.com/api/read');
$posts = $xml->xpath("/tumblr/posts/post/tag[contains(text(),'xml') or contains(text(),'php') or contains(text(),'firefox')]/..");
foreach($posts as $post) {
if ($post->{'regular-title'}) {
$slug = $post->{'regular-title'};
} else if ($post->{'link-text'}) {
$slug = $post->{'link-text'};
} else {
$slug = $post['url-with-slug'];
}
echo "
<li>
<a href='{$post['url-with-slug']}'>".$slug."</a>
</li>
";
}
?>
</ul>
修改强>
并且,您也可能希望匹配TAG
元素的整个文本,以便在您需要xml-is-for-noobs
时不会对xml
之类的内容进行匹配仅标签。 contains()
会匹配两者,而下面只会匹配xml
。
/tumblr/posts/post/tag[text() = 'xml']/..
因此,根据您的评论,如果您要查找标记为events
的帖子,但又不想抓住bowling-events
,prevents fun
,other events
等标签,等等......,你想要text() = 'events'
匹配。另一方面,如果您想要在events
节点的文本中与TAG
匹配任何内容,请使用contains(text(), 'events')
方法。
编辑2
如果您尝试限制结果,请使用position()
:
(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]
请注意,我的网页上的示例不包含text()
匹配,因为没有足够的条目来支持子匹配并且仍然具有效率。但是,这应该有效。
http://jfcoder.com/test/tumblrtest.php
XPath选择属于TAG
元素的所有POST
个元素,然后选择..
的父元素(TAG
),它会为您提供一个包含的SimpleXML对象您正在寻找的相关POST
元素。
然后,它遍历每个元素,将$post
的信息打印到UL
元素中。