我试图只获得在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
解决方法:
首先,您需要将标记放在属于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专家,所以应该有一种比我想象的更干净的方法.
而且由于我并不是真的在研究链接文本的三元数,或者我不知道一个或另一个是否总是可用,所以这应该是更具描述性的,并使用备用网址.
<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标签时,就不会在xml-is-for-noobs之类的内容上获得匹配. contains()将同时匹配两者,而以下仅匹配xml.
/tumblr/posts/post/tag[text() = 'xml']/..
因此,根据您的评论,如果您要查找带有标记事件的帖子,但又不想捕获诸如保龄球事件,阻止娱乐,其他事件等之类的标记,则希望使text()= “赛事”比赛.另一方面,如果DID想要使任何内容与TAG节点文本中的事件匹配,请使用contains(text(),’events’)方法.
编辑2
如果要限制结果,请使用position():
(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]
请注意,我网页上的示例不包含text()匹配项,因为没有足够的条目来支持子匹配项并且仍然有效.但是,那应该起作用.
http://jfcoder.com/test/tumblrtest.php
XPath选择属于POST元素的所有TAG元素,然后选择该TAG的父级(..),这将为您提供一个SimpleXML对象,其中包含要查找的相关POST元素.
然后,迭代每个元素,将$post的信息打印到UL元素中.