为什么PHP将这个DOM对象视为数组?
我将遵循本教程: 循环遍历XML部分是有问题的。 出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了返回长度外,不返回任何关于对象属性的信息,但程序输出看起来好像不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它们为什么PHP将这个DOM对象视为数组?,php,xml,domparser,php-7.3,Php,Xml,Domparser,Php 7.3,我将遵循本教程: 循环遍历XML部分是有问题的。 出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了返回长度外,不返回任何关于对象属性的信息,但程序输出看起来好像不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它们 $xml=new DOMDocument (); $xml->load('note.xml'); $array_of_nodes=$xml->documentEleme
$xml=new DOMDocument ();
$xml->load('note.xml');
$array_of_nodes=$xml->documentElement->childNodes;
var_dump($array_of_nodes);
foreach($array_of_nodes as $item) {
echo $item->nodeName." ".$item->nodeValue."<br>";
}
$xml=newdomdocument();
$xml->load('note.xml');
$array\u of_nodes=$xml->documentElement->childNodes;
var_dump($array_of_节点);
foreach($节点数组作为$项){
echo$item->nodeName。“$item->nodeValue。”
”;
}
Var dump函数返回以下内容:
object(DOMNodeList)#3(1){[“length”]=>int(9)}#text
但执行的代码如下所示:
for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
$node = $nodeList->item($i);
//...
}
正文=
to=Tove
正文=
from=Jani
正文=
标题=提醒
正文=
这个周末别忘了我
正文=
DOMNodeList
实现了几个接口:Traversable
、ArrayAccess
和Countable
。这允许使用通用语法访问列表中的节点对象。如果没有它们,则需要使用以下特定方法和属性:
for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
$node = $nodeList->item($i);
//...
}
ArrayAccess
允许您使用数组语法按索引访问节点,它将->项(…)
调用替换为[…]
if (isset($nodeList[0])) {
$node = $nodeList[0];
//...
}
Countable
允许您使用count($nodeList)
而不是$nodeList->length
Traversable
对视觉的影响最大。它大大降低了呼叫的复杂性。但这只是第一个好处。您可以使用typehints或instanceof
对接口进行验证。这将使代码解耦,使其更加健壮和可重用
但是,如果使用Xpath表达式,则通过DOM进行循环要容易得多。如果您以前使用过CSS选择器,则可以将Xpath表达式视为更强大的同级表达式
$document = new DOMDocument();
$document->load('note.xml');
$xpath = DOMXpath($document);
foreach($xpath->evaluate('/note') as $item) {
echo 'To: ', $xpath->evaluate('string(to)', $item), "\n";
echo 'From: ', $xpath->evaluate('string(from)', $item), "\n";
echo 'Title: ', $xpath->evaluate('string(heading)', $item), "\n";
echo 'Text: ', $xpath->evaluate('string(body)', $item), "\n";
}
childNodes
是DOMNodeList
类型的属性。var_dump没有显示任何关于它的内容,原因很简单,因为var_dump只显示开发人员通过调用以下C函数声明的类属性
ZEND_API int zend_declare_property(...)
ZEND_API int zend_declare_property_null(...)
ZEND_API int zend_declare_property_bool(...)
ZEND_API int zend_declare_property_long(...)
ZEND_API int zend_declare_property_double(...)
ZEND_API int zend_declare_property_string(...)
ZEND_API int zend_declare_property_stringl(...)
资料来源:akond的答复:
也就是说,DOM扩展的开发人员选择不公开DOMNodeList
类的结构
之所以可以遍历DOMNodeList
,是因为它实现了Traversable
接口,该接口表示可以通过使用foreach
来遍历类,该对象就像数组一样是可遍历的
foreach ($nodeList as $node) {
//...
}