我建議你使用XPath了點。隨着的DOMDocument和DOMXPath可以高度從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');
$項目不反對類型,這就是爲什麼錯誤顯示。 – 2015-04-04 21:33:35
使用xpath代替,在結果爲空的情況下更容易處理。 – hakre 2015-04-04 21:51:09