2016-05-18 19 views
0

這是XML文檔的一部分:如何使用PHP從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 =「圈地」屬性。 什麼是最簡單的方法沒有額外的IF和循環?

謝謝!

+0

我認爲你可以爲此應用模板並選擇rel屬性爲外殼的所有鏈接項目。 –

+0

[你如何在PHP中解析和處理HTML/XML?](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php ) – miken32

回答

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"; 
} 
0

您正在使用simplexml。只要使用 「屬性()」 函數: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']; 
    } 
} 
+0

在這個循環中,我們將不採取必要的數據,如果例如存在僅一個鏈路串:' Dunnock_D http://www.flickr.com/people/dunnock_d/ <鏈路rel =「enclosure」type =「image/jpeg」href =「http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg」/> ' –

+0

你說得對。如果你確切地知道你的XML,只需刪除foreach循環,並開心:) –

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]); 
} 

輸出:

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

var_dump(
    $xpath->evaluate('string(/entry/link[@rel="enclosure"]/@href)') 
); 

這將返回一個空字符串,如果:

string(63) "http://farm8.staticflickr.com/7548/26820724620_1d221c3187_b.jpg" 

隨着DOM引導稍大,但可以作爲一個字符串直接獲取href屬性該表達式不匹配。

+0

謝謝@ThW!那是我一直在尋找的! –

相關問題