我正在使用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
我很难弄清楚为什么这不能转换为字符串?任何帮助将不胜感激!
答案 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
的子类。后者具有nodeValue
和textContent
属性,因此您可以尝试:
$priceValue = $price[5]->nodeValue
或
$priceValue = $price[5]->textContent
你甚至可以更进一步检索实际的文本节点子节点,但这可能超出你的需要而且只会使事情变得复杂(特别是对于只读访问)。