PHP - 如何在每个循环中检查元素?
PHP - How to check for element each loop?
我正在使用下面的循环来解析 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 变量不存在时将其替换为静态字符串?
我建议您为此使用 xpath。使用 DOMDocument 和 DOMXPath 您可以从 DOMXPath::evaluate
method 中受益匪浅,因为您可以直接获取字符串值。如果查询的元素不存在,您将得到一个空字符串(如果找不到节点,您还可以使用 count()
和 returns 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]
returns 一个空节点列表和 string()
function returns ""
(空字符串)。否则它 returns 该节点列表中第一个节点(按文档顺序)的字符串值。
总而言之,这使得以稳定的方式从文档中获取信息变得非常容易。但是,您必须学习一些小的 xpath 语言。但是我们在 Stackoverlow 上也有很好的支持。
完整示例(和 online demo to play around):
<?php
/**
* PHP - How to check for element each loop?
* @link
*/
$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');
我正在使用下面的循环来解析 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 变量不存在时将其替换为静态字符串?
我建议您为此使用 xpath。使用 DOMDocument 和 DOMXPath 您可以从 DOMXPath::evaluate
method 中受益匪浅,因为您可以直接获取字符串值。如果查询的元素不存在,您将得到一个空字符串(如果找不到节点,您还可以使用 count()
和 returns 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]
returns 一个空节点列表和 string()
function returns ""
(空字符串)。否则它 returns 该节点列表中第一个节点(按文档顺序)的字符串值。
总而言之,这使得以稳定的方式从文档中获取信息变得非常容易。但是,您必须学习一些小的 xpath 语言。但是我们在 Stackoverlow 上也有很好的支持。
完整示例(和 online demo to play around):
<?php
/**
* PHP - How to check for element each loop?
* @link
*/
$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');