PHP-如何检查每个循环的元素?

PHP-如何检查每个循环的元素?,php,xml,loops,dom,Php,Xml,Loops,Dom,我使用下面的循环来解析XML文件 $link = $item->getElementsByTagName('link')->item(0)->firstChild->nodeValue; $image = $item->getElementsByTagName('enclosure')->item(0)->getAttribute('url'); 但是,有时XML项没有“enclosure”元素,我的整个页面失败,出现以下错误 PHP Fatal er

我使用下面的循环来解析XML文件

$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

如果$image变量不存在,如何检查元素each循环并用静态字符串替换它?

我建议您使用xpath。使用DOMDocumentDOMXPath可以从中获益匪浅,因为您可以直接获取字符串值。如果查询的元素不存在,您将得到一个空字符串(您还可以使用
count()
检查existance,如果未找到节点,则返回
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>
如本例所示,第一个xpath表达式计算为
元素的文本内容。第二个表达式求值为空字符串,因为该属性不存在

当您访问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]
返回一个空节点列表,并为其返回
(空字符串)。否则,它将返回该节点列表中第一个节点(按文档顺序)的字符串值

总而言之,这使得以稳定的方式从文档中获取信息变得非常容易。但是,您必须学习一些xpath语言。但我们在Stackoverlow上也有很好的支持

完整示例(和):

loadXML($buffer);
$xpath=新的DOMXPath($doc);
$item=$doc->getElementsByTagName('itme')->item(0);
$xpath=新的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');

$item不是对象类型,这就是显示错误的原因。请改用xpath,这样在结果为空的情况下更容易处理。感谢您提供如此详细的答案。现在一切正常。干杯,你的也干杯。请阅读手册中有关工具箱中此新功能的部分。了解(foreach)循环中此类解析作业的上下文节点尤其有用。
$item->getElementsByTagName('enclosure')->item(0)->getAttribute('url');
                                             ^               ^
                                             |               |
                                   there is no item at       |
                                  index 0, this is NULL      |
                                                             |
                                                         NULL has no
                                                     getAttribute method
                                                        = FATAL ERROR
<?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');