我试图使用PHP从XML文件中删除某些节点,由于某些原因它无法正常工作,我得出的结论可能就是这种情况,因为PHP没有返回正确的数字节点,在所述XML文件中。
这是XML文件:
<?xml version="1.0"?>
<Filenames>
<newFile>
<link>somelink</link>
<ViewLink>someotherlink</ViewLink>
<FileName>test</FileName>
</newFile>
<newFile>
<link>somelink</link>
<ViewLink>someotherlink</ViewLink>
<FileName>test</FileName>
</newFile>
</Filenames>
......依此类推(文件更长,但我总是对节点等使用相同的名称,你明白了)
由于删除某些节点无法解决问题,我尝试首先从xml文件中获取信息,然后尝试检查PHP可以查找的节点数<newFile>
(我想要删除的节点) 。
为此,我做了以下事情:
<?php
$doc = new DOMDocument();
$doc->load("FilenameList.xml");
$root = $doc->documentElement;
$newFiles = $root->getElementsByTagName("newFile");
echo count($newFiles);
?>
但是,返回&#34; 1&#34;,尽管显然有更多的节点。
我还尝试使用simpleXML计算<newFile>
个节点的数量,但同样,它不起作用。我对此感到非常困惑,因为我过去使用了相同的语法并且完美地完成了。
我尝试的另一件事是这样做:
$newFiles = $doc->getElementsByTagName("newFile");
而不是$root = ...
此外,我还尝试使用sizeof()
代替count()
。
我错过了什么或有没有人知道出了什么问题?
答案 0 :(得分:2)
DOMDocument::getElementsByTagName函数返回类DOMNodeList的新实例。在提出问题时,这样的班级有以下签名:
DOMNodeList implements Traversable {
/* Properties */
readonly public int $length ;
/* Methods */
DOMNode DOMNodelist::item ( int $index )
}
该类实现了Traversable接口(因此您可以foreach ()
),但不是Countable接口,这将允许count()
生成有用的东西。
解决方案是您可以在类签名中看到的$length
属性:
length
列表中的节点数。有效子节点索引的范围 是0到长度 - 包括1。
从PHP/7.2.0开始,最终实现了Countable
接口:
<强> DOM:强>
实现了FR #74837(为DomNodeList实现了Countable和 DOMNamedNodeMap)。
当前版本的文档是:
DOMNodeList implements Traversable , Countable {
/* Properties */
readonly public int $length ;
/* Methods */
public int count ( void )
DOMNode item ( int $index )
}
...原始代码应该最终有用。
答案 1 :(得分:1)
$doc = new DOMDocument;
$doc->loadXML("FilenameList.xml");
$newFiles = $doc->getElementsByTagName('newFile');
foreach ($newFiles as $newFile) {
$newFile++;
}
echo $newFile;
你忘记了foreach循环。请检查此http://php.net/manual/en/domdocument.getelementsbytagname.php