我遵循这个教程:
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
标题=提醒
这个周末别忘了我!
DOMNodeList
实现了几个接口:Traversable
,ArrayAccess
和Countable
。这允许使用泛型语法访问列表中的节点对象。如果没有它们,您将需要使用如下特定的方法和属性:
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";
}
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的回答:为什么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: