首先,您需要将标记放置在属于
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的功能。
<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'
匹配。另一方面,如果您确实想匹配
TAG
节点文本中包含
events
的任何内容,请使用
contains(text(),'events')
方法。
编辑2
如果您想限制结果,请使用position()
:
(/tumblr/posts/post/tag[text() = 'xml']/..)[position() <= 3]
注意,我的网页示例没有包括
text()
匹配,因为没有足够的条目支持子匹配并保持生产力。但是,那应该是可行的。
http://jfcoder.com/test/tumblrtest.php
XPath选择所有属于POST元素的TAG元素,然后选择该TAG元素的父级(..),这将给您一个包含相关POST元素的SimpleXML对象。接下来,它遍历每个元素,将$post的信息打印到UL元素中。
contains()
部分。从听起来的意思来看,你会有一个包含语句,是/tumblr/posts/post/tag[contains(text(),'events')]/..
。 - Jared Farrish/..
来选择父级(我已经修复了)。 - Jared Farrish$i++
),或者使用XPath的position()
(或者使用CSS,正如你所指出的)。请参考我的编辑。 - Jared Farrish