2015-04-04 17 views
1

我使用下面的循環來解析XML文件。PHP - 如何檢查每個循環的元素?

$link = $item->getElementsByTagName('link')->item(0)->firstChild->nodeValue; 
$image = $item->getElementsByTagName('enclosure')->item(0)->getAttribute('url'); 

然而,有些時候的XML項目沒有一個'enclosure'元素,我的整個頁面失敗,下面的錯誤

PHP Fatal error: Call to a member function getAttribute() on a non-object 

我如何檢查元素中的每個循環和更換$圖像變量與靜態字符串,如果它不存在?

+0

$項目不反對類型,這就是爲什麼錯誤顯示。 – 2015-04-04 21:33:35

+0

使用xpath代替,在結果爲空的情況下更容易處理。 – hakre 2015-04-04 21:51:09

回答

2

我建議你使用XPath了點。隨着的DOMDocumentDOMXPath可以高度從DOMXPath::evaluate method受益,因爲你可以直接讀取字符串值。如果該元素用於查詢不存在,你會得到一個空字符串(您也可以查看所有腦幹與count()返回0的情況下,一個節點未找到)。

實施例:

$item = $doc->getElementsByTagName('itme')->item(0); 
$xpath = new DOMXPath($doc); 

echo "link.....: ", $xpath->evaluate('string(.//link)', $item), "\n"; 
echo "enclosure: ", $xpath->evaluate('string(.//enclosure[@url])', $item), "\n"; 

創建一些示例XML

<feed-me> 
    <item> 
     <link>http://nytimes.com/2004/12/07FEST.html</link> 
     <actor class="foo" xml:space="preserve"> </actor> 
    </item> 
</feed-me> 

並且輸出是

link.....: http://nytimes.com/2004/12/07FEST.html 
enclosure: 

如這個例子所示,評估的文本的第一xpath表達式<link>元素的內容。第二個表達式評估爲空字符串,因爲該屬性不存在。

的問題,即從非現有元件獲得屬性作爲你擁有它在訪問對象在PHP代碼

$item->getElementsByTagName('enclosure')->item(0)->getAttribute('url'); 
              ^   ^
              |    | 
            there is no item at  | 
            index 0, this is NULL  | 
                  | 
                 NULL has no 
                getAttribute method 
                 = FATAL ERROR 

隨着xpath表達式,從另一方面

string(.//enclosure[@url]) 

內部表達式.//enclosure[@url]返回一個空節點列表,string() function返回""(空字符串)。否則,它返回該節點列表中第一個節點(按照文檔順序)的字符串值。

總而言之,這使得它很容易以穩定的方式從文檔中獲取信息。但是你必須學習一些小的xpath語言。但是我們在Stackoverlow也有很好的支持。在全(和online demo to play around

例子:

<?php 
/** 
* PHP - How to check for element each loop? 
* @link http://stackoverflow.com/a/29452042/367456 
*/ 

$buffer = <<<XML 
<feed-me> 
    <item> 
     <link>http://nytimes.com/2004/12/07FEST.html</link> 
     <actor class="foo" xml:space="preserve"> </actor> 
    </item> 
</feed-me> 
XML; 

$doc = new DOMDocument(); 
$doc->loadXML($buffer); 
$xpath = new DOMXPath($doc); 

$item = $doc->getElementsByTagName('itme')->item(0); 

$xpath = new DOMXPath($doc); 

echo "link.....: ", $xpath->evaluate('string(.//link)', $item), "\n"; 
echo "enclosure: ", $xpath->evaluate('string(.//enclosure[@url])', $item), "\n"; 

$item->getElementsByTagName('enclosure')->item(0)->getAttribute('url'); 
+0

感謝您的詳細解答。現在一切正常。乾杯。 – Yonkee 2015-04-04 22:32:09

+0

您也歡呼。閱讀手冊中有關此工具箱中新功能的信息。在(foreach)循環中瞭解這種解析工作的上下文節點是特別好的。 – hakre 2015-04-04 22:33:25

相關問題