当前位置: 首页 > 知识库问答 >
问题:

为什么PHP将这个DOM对象视为数组?

东方志尚
2023-03-14

我遵循这个教程:

https://www.w3schools.com/php/php_xml_dom.asp

循环遍历XML部分是有问题的。出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了长度之外,不返回任何关于对象属性的信息,但程序输出看起来像是不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它们?

$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>";
}

Var dump函数返回以下内容:

对象(DOMNodeList)#3(1){[“长度”]=

但执行的代码如下所示:

到=Tove

from=Jani

标题=提醒

这个周末别忘了我!

共有2个答案

萧心水
2023-03-14

DOMNodeList实现了几个接口:TraversableArrayAccessCountable。这允许使用泛型语法访问列表中的节点对象。如果没有它们,您将需要使用如下特定的方法和属性:

for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
  $node = $nodeList->item($i);
  //...
}

Traversable允许您使用Foreach

foreach ($nodeList as $node) {
  //...
}

ArrayAccess允许您使用数组语法按索引访问节点,它取代了-

if (isset($nodeList[0])) {
  $node = $nodeList[0];
  //...
}

Countable允许您使用count($nodeList)而不是$nodeList-

Traversable最具视觉冲击力。它极大地降低了调用的复杂性。但这只是第一个好处。您可以使用类型提示或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";
}

黎同
2023-03-14

childNodesDOMNodeList类型的属性。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的回答:为什么var_dump不能处理DomDocument对象,而print($dom)可以处理DomDocument对象-

也就是说,DOM扩展的开发人员选择不公开DOMNodeList类的结构。

之所以可以迭代通过DOMNodeList是因为它实现了Traversable接口,该接口表示可以通过使用Foreach来迭代类。

 类似资料:
  • 感谢您抽出时间阅读。 在提问之前,我想指出,我已经在StackOverflow/互联网上阅读了尽可能多的类似文章。 我的目标是将来自API请求的响应反序列化为可用的java对象。 我正在向终结点发送 POST 请求,以便在我们的计划中创建作业。作业创建成功,并在正文中返回以下 XML: 但是,当我尝试将其散集到POJO中时,映射没有按预期工作。 为了简单起见,我试图只捕获第一个字段,id,titl

  • 问题内容: 在阅读有关Java线程的文章时,我经常注意到这样的表达:“当前线程是该对象的监视器的所有者”。我的意思是:线程有权在对象上进行操作。但是我很困惑,为什么我们使用“对象的监视器”而不是“对象的锁”? 简而言之,我不知道“监视”一词的含义。这个问题可能很奇怪而且很简单。但我希望任何人都能帮助解决它。3ks 问题答案: 但是我感到困惑的是为什么要在“对象的锁”中使用“对象的监视器”一词呢?

  • 问题内容: 看到这个答案。它说: 六个非常糟糕的例子; … 锁定在可变字段上。例如,synced(object){object = …; } 锁定可变字段有什么问题?如果被声明为但不是不可变的类怎么办? 问题答案: 这是一个坏主意,因为如果另一个线程更改了关键部分中的引用,则这些线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。例: 假设有2个线程试图进入此关键部分。线

  • 它将把牌阵的一半分配给玩家和计算机(玩家得到前半部分,计算机得到后半部分)。现在这是先洗牌,所以是的,这似乎是公平的。 我得到的出界错误是这一行:

  • 我试图做一个代码,将打印所有元素的内容与从一些链接,但它不起作用,我不知道为什么,这是代码: 当我粘贴“someurl”而不是

  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1: