这是XML文档的一部分:
<entry>
<author>
<name>Dunnock_D</name>
<uri>http://www.flickr.com/people/dunnock_d/</uri>
</author>
<link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc/2.0/deed.en" />
<link rel="enclosure" type="image/jpeg" href="http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg" />
</entry>
我的代码:
$xml = simplexml_load_string($result);
foreach ($xml->entry as $pixinfo) {
echo $pixinfo->link[1]['href'];
}
问题是可能有一个或多个链接字符串,我只需要特别使用 rel =“enclosure”属性。 没有额外的IF和循环,最简单的方法是什么?
谢谢!
答案 0 :(得分:1)
为此,您可以使用DOMXPath,更具体地说是query功能。假设您的$result
变量包含以下内容:
<?xml version='1.0' encoding='UTF-8'?>
<entries>
<entry>
<author>
<name>Dunnock_D</name>
<uri>http://www.flickr.com/people/dunnock_d/</uri>
</author>
<link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc/2.0/deed.en" />
<link rel="enclosure" type="image/jpeg" href="http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg" />
</entry>
<entry>
<author>
<name>Dunnock_D</name>
<uri>http://www.flickr.com/people/dunnock_d/</uri>
</author>
<link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc/2.0/deed.en" />
<link rel="enclosure" type="image/jpeg" href="http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg" />
</entry>
<entry>
<author>
<name>Dunnock_D</name>
<uri>http://www.flickr.com/people/dunnock_d/</uri>
</author>
<link rel="license" type="text/html" href="https://creativecommons.org/licenses/by-nc/2.0/deed.en" />
<link rel="enclosure" type="image/jpeg" href="http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg" />
</entry>
</entries>
我知道这些条目是重复的,但它仅用于演示目的。仅获取机箱链接的代码为:
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->loadXML($result);
$xpath = new DOMXpath($doc);
$entries = $xpath->query('//entries/entry');
foreach ($entries as $entry) {
$link = $xpath->query('link[@rel="enclosure"]', $entry)->item(0);
$href = $link->getAttribute('href');
echo "{$href}\n";
}
答案 1 :(得分:0)
您使用的是simplexml。只需使用&#34; attributes()&#34;功能:http://php.net/manual/pt_BR/simplexmlelement.attributes.php
或者您可以直接访问:
foreach ($xml->entry as $pixinfo) {
if($pixinfo->link[1]['rel'] == 'enclosure') {
echo $pixinfo->link[1]['href'];
}
}
答案 2 :(得分:0)
解决方案是Xpath。
使用SimpleXML,您可以获取属性节点并将生成的SimpleXMLElement转换为字符串。你应该确保在投射前有一个元素。 SimpleXMLElement::xpath()
将始终返回SimpleXMLElement
个对象的数组。
$entry = new SimpleXMLElement($xml);
$enclosures = $entry->xpath('link[@rel="enclosure"]/@href');
if (count($enclosures) > 0) {
var_dump((string)$enclosures[0]);
}
输出:
string(63) "http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg"
使用DOM,引导程序略大,但您可以直接以字符串形式获取href属性:
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
var_dump(
$xpath->evaluate('string(/entry/link[@rel="enclosure"]/@href)')
);
如果表达式不匹配,这将返回一个空字符串。