You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FoxPro生成嵌套目录结构的XML文件?

FoxPro嵌套目录结构XML生成代码修正方案

当前尝试用FoxPro生成包含未知层级嵌套目录与文件的XML结构,但现有代码存在两个核心问题:

  • 所有文件夹节点均直接挂载在根节点下,未实现正确的层级嵌套
  • 根目录下的文件被错误放入嵌套目录节点中

问题根源分析

原代码的核心缺陷在于递归遍历函数GetFilesRecursively未维护层级上下文:

  1. 创建文件夹节点时始终绑定全局的loRoot节点,导致所有文件夹都成为根节点的直接子节点,无法形成嵌套结构
  2. 处理文件时依赖全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:21:01