热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么count(DOMNode>childNodes)返回的子项数不正确?(PHP和XML)

我有一个名为processDeleteForm()的PHP函数,用于从名为structure.xml的xml文档中删除指定的节点.到目前为止我遇到的唯一问题是在processDel

我有一个名为processDeleteForm()的PHP函数,用于从名为structure.xml的xml文档中删除指定的节点.到目前为止我遇到的唯一问题是在processDeleteForm()中,它通过循环遍历父节点的每个子节点来搜索要删除的节点,并通过“name”属性匹配它,但是我没有能够为循环获取正确数量的子节点,因此它在到达正确的节点之前就会停止.相关代码:

function processDeleteForm($dir, $filename)
{
echo "Processing delete request.
";
echo "Request to delete ".$filename." from ".$dir.".
";
$xmlDoc = new DOMDocument();
$xmlDoc->load("structure.xml");
$node = dirDOMNodeWritable($dir, $xmlDoc);
$target;
echo "Working directory has ".count($node->childNodes)." child(ren).
";
for($x = 0; $x childNodes); $x++)
{
if($node->childNodes->item($x)->getAttribute("name") == $filename)
{
$target = $node->childNodes->item($x);
echo "Target found.
";
}
else
{
echo "Searching for target...
";
}
}
if($target->getAttribute("type") != "directory")
{
$fstored = "uploads/".$target->childNodes->item(0)->wholeText;
unlink($fstored);
}
$node->removeChild($target);
$file = fopen("structure.xml", "w");
fwrite($file, $xmlDoc->saveXML());
}

structure.xml:







intro.mp3
music.mp3
supersonic.mp3
memories.mp3
chiptek.mp3
intermission.mp3
kicks.mp3
1997.mp3


intro.ogg
music.ogg
supersonic.ogg
memories.ogg
chiptek.ogg
intermission.ogg
kicks.ogg
1997.ogg








*以上应该是xml文件的内容,但我无法弄清楚如何显示它.如果有更多关于在stackoverflow上格式化xml的知识的人可以解决它,我会非常感激.

查看负责创建名为“test01”,“test02”和“test03”的目录的代码可能也很有用:

function processNewForm($dir, $dirName, $readPrivs, $writePrivs)
{
$readString = "";
$writeString = "";
$dirOwner = $_SESSION["user"];
for($x = 0; $x {
$readString += $readPrivs[$x].",";
}
for($x = 0; $x {
$writeString += $writePrivs[$x].",";
}
$xmlDoc = new DOMDocument();
$xmlDoc->load("structure.xml");
$node = dirDOMNodeWritable($dir, $xmlDoc);
$newDir = $xmlDoc->createElement("directory");
$newDir->setAttribute("name", $dirName);
$newDir->setAttribute("owner", $dirOwner);
$newDir->setAttribute("read", $readString);
$newDir->setAttribute("write", $writeString);
$newDir->setAttribute("type", "directory");
$node->appendChild($newDir);
$file = fopen("structure.xml", "w");
fwrite($file, $xmlDoc->saveXML());
}

当前输出如下所示:

Received delete request.
Validating delete request... Request is valid.
Processing delete request.
Request to delete test03/ from /.
Working directory has 1 child(ren).
Searching for target...
Notice: Undefined variable: target in E:\aepi\dev\fileshare.php on line 540
Fatal error: Call to a member function getAttribute() on a non-object in E:\aepi\dev\fileshare.php on line 540

解决方法:

从PHP manual for count():


Returns the number of elements in var. If var is not an array or an object with implemented Countable interface, 1 will be returned.


DOMNode::$childNodesDOMNodeList对象.它不是Countable.它总会返回一个(即使是空的).请改用其length财产:

$count = $element->childNodes->length;

更新:从PHP 7.2起,DOMNodeList已成为可数.


推荐阅读
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在编译 PHP7 的 PDO MySQL 扩展时,可能会遇到 `[mysql_driver.lo]` 错误 1。该问题通常出现在 `pdo_mysql_fetch_error_func` 函数中。本文详细介绍了导致这一错误的常见原因,包括依赖库版本不匹配、编译选项设置不当等,并提供了具体的解决步骤和调试方法,帮助开发者快速定位并解决问题。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
author-avatar
手机用户2602939543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有