DOMElement无法转换

时间:2014-07-28 23:02:12

标签: php arrays dom

我正在使用DOM通过类名解析元素。我使用以下功能检索信息:

<?php function getElementsByClassName(DOMDocument $DOMDocument, $ClassName) {
    $Elements = $DOMDocument -> getElementsByTagName("*");
    $Matched = array();

    foreach($Elements as $node) {
        if( ! $node -> hasAttributes())
            continue;
            $classAttribute = $node -> attributes -> getNamedItem('class');

        if( ! $classAttribute)
            continue;
            $classes = explode(' ', $classAttribute -> nodeValue);

        if(in_array($ClassName, $classes))
            $Matched[] = $node;
    }

  return $Matched;
}

?>

现在,我使用$ price数组存储getElementsByClassName()检索到的所有信息:

$price = getElementsByClassName($doc, 'amount');

echo $price;

当回应$ price时,它证实了我的假设它是一个数组。

当使用print_r($ price);时,数组显示这个,它包含19个不同的变量,这应该是应该存在的确切数量:

Array ( [0] => DOMElement Object ( ) [1] => DOMElement Object ( ) [2] => DOMElement Object ( ) [3] => DOMElement Object ( ) [4] => DOMElement Object ( ) [5] => DOMElement Object ( ) [6] => DOMElement Object ( ) [7] => DOMElement Object ( ) [8] => DOMElement Object ( ) [9] => DOMElement Object ( ) [10] => DOMElement Object ( ) [11] => DOMElement Object ( ) [12] => DOMElement Object ( ) [13] => DOMElement Object ( ) [14] => DOMElement Object ( ) [15] => DOMElement Object ( ) [16] => DOMElement Object ( ) [17] => DOMElement Object ( ) [18] => DOMElement Object ( ) ) 

但是,当我尝试将此数组用作字符串时,我收到此错误:

echo $price[5];
Catchable fatal error: Object of class DOMElement could not be converted to string

我很难弄清楚为什么这不能转换为字符串?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我必须说你的函数getElementsByClassName完全没必要。

使用XPath可以轻松地使用PHP的DOM库检索属于某个类的所有节点。

例如,像这样(假设$dom是您的DOM结构对象):

$prices = array();

foreach((new DOMXPath($dom))->query('//*[@class="amount"]') as $price) {
   $prices[] = $price->nodeValue;
}

答案 1 :(得分:-1)

因为DOMElement不是字符串而且没有“魔法”__toString()方法。

首先Google result for "DOMElement php"引导DOMElement的PHP文档,它是DOMNode的子类。后者具有nodeValuetextContent属性,因此您可以尝试:

$priceValue = $price[5]->nodeValue

$priceValue = $price[5]->textContent

你甚至可以更进一步检索实际的文本节点子节点,但这可能超出你的需要而且只会使事情变得复杂(特别是对于只读访问)。