如何用FoxPro生成嵌套目录结构的XML文件?
FoxPro嵌套目录结构XML生成代码修正方案
当前尝试用FoxPro生成包含未知层级嵌套目录与文件的XML结构,但现有代码存在两个核心问题:
- 所有文件夹节点均直接挂载在根节点下,未实现正确的层级嵌套
- 根目录下的文件被错误放入嵌套目录节点中
问题根源分析
原代码的核心缺陷在于递归遍历函数GetFilesRecursively未维护层级上下文:
- 创建文件夹节点时始终绑定全局的
loRoot节点,导致所有文件夹都成为根节点的直接子节点,无法形成嵌套结构 - 处理文件时依赖全局
loFolder变量,根目录的文件会被错误挂载到最后一个创建的文件夹节点下
修正后的完整代码
********************************* **** 变量初始化 **** ********************************* set asserts on set date ymd public loXml as MSXML2.DOMDocument60 public loRoot as MSXML2.IXMLDOMElement public lcRootDir as String public lcManifestNS as String lcRootDir = "C:\\LoopTest" && 用户定义的根目录 lcManifestNS = "http://www.randomnamespace.com/ServerManifest/1.1" && 文档所有元素的命名空间 *********************************** **** 创建XML文档 **** *********************************** loXml = createobject("MSXML2.DOMDocument.6.0") loRoot = loXml.createNode("Element", "au:Manifest", lcManifestNS) && 根元素 loRoot.setAttribute("Path", lcRootDir) && 根元素的Path属性 && 调用递归函数,传入根目录和根节点作为父节点 GetFilesRecursively(lcRootDir, loRoot) loXml.appendChild(loRoot) && 将根节点加入文档 ********************* **** 输出XML文件 **** ********************* loXml.save('C:\\results\\ex2_manifest_test.xml') && 将XML保存到指定路径 *************** **** 函数定义 **** *************** procedure getfilesrecursively(tcFolder, toParentNode) assert ( vartype(m.tcFolder) = 'C' ) assert ( vartype(m.toParentNode) = 'O' ) local lnFile, laFiles[1], lcItemName, dtModified, loCurrentFolderNode && 遍历当前目录下的所有项(文件和文件夹) for lnFile = 1 to adir(laFiles, addbs(m.tcFolder) + '*', 'd') lcItemName = laFiles[m.lnFile, 1] && 跳过.和..目录 if m.lcItemName == "." or m.lcItemName == ".." loop endif && 格式化最后修改时间为XML兼容格式 dtModified = strtran(dtoc(laFiles[lnFile, 3]), '/', '-') + "T" + laFiles[lnFile, 4] && 判断当前项是否为子目录 if directory( addbs(m.tcFolder)+m.lcItemName, 1 ) && 创建文件夹节点并挂载到当前父节点下 loCurrentFolderNode = loXml.createNode("Element", "au:Folder", lcManifestNS) loCurrentFolderNode.setAttribute("Name", m.lcItemName) loCurrentFolderNode.setAttribute("Date", m.dtModified) toParentNode.appendChild(loCurrentFolderNode) && 递归遍历子目录,将当前文件夹节点作为父节点传递 getfilesrecursively(addbs(m.tcFolder)+m.lcItemName, loCurrentFolderNode) else && 创建文件节点并直接挂载到当前父节点下 local loFileNode loFileNode = loXml.createNode("Element", "au:File", lcManifestNS) loFileNode.setAttribute("Name", m.lcItemName) loFileNode.setAttribute("Date", m.dtModified) toParentNode.appendChild(loFileNode) endif endfor endproc
关键修改说明
- 新增父节点参数:递归函数
GetFilesRecursively增加toParentNode参数,传递当前层级的父节点,严格维护嵌套上下文 - 文件夹嵌套逻辑:创建文件夹节点后挂载到当前父节点下,递归调用时将新文件夹节点作为父节点传递,形成正确的层级嵌套
- 文件挂载修正:文件节点直接挂载到当前父节点下,彻底避免依赖全局变量导致的根目录文件错放问题
- 优化目录过滤:直接判断
lcItemName是否为.或..,替代原字符串替换逻辑,更简洁可靠 - 局部变量隔离:将节点对象改为局部变量,避免全局变量污染
内容的提问来源于stack exchange,提问作者DizzleBeans
相关产品推荐
相关产品推荐

