如何用PHP从XML字符串中获取精确参数?

时间:2016-05-18 16:54:36

标签: php xml

这是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和循环,最简单的方法是什么?

谢谢!

3 个答案:

答案 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)')
);

如果表达式不匹配,这将返回一个空字符串。