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

Content Server中Groovy脚本导出多节点XML文件问题求助

你猜得没错——在Content Server的Groovy脚本环境里,sendFile确实只能执行一次。它的作用是向客户端返回单个文件响应,多次调用的话要么会被覆盖,要么只有第一次调用生效。针对你的需求,我给你两种解决方案,看你更倾向哪一种:

方案1:生成每个子文件夹的独立XML并打包为ZIP下载

如果还是想给每个子文件夹生成单独的XML文件,我们可以把所有XML内容打包成一个ZIP文件,再通过sendFile一次性返回:

import java.util.zip.ZipOutputStream
import java.util.zip.ZipEntry
import java.io.ByteArrayOutputStream

// 获取目标文件夹及其子节点
def targetFolder = docman.getFolder(129335)
def childNodes = targetFolder.getChildren()

// 初始化ZIP输出流
ByteArrayOutputStream zipByteStream = new ByteArrayOutputStream()
ZipOutputStream zipStream = new ZipOutputStream(zipByteStream)

try {
    for (CSNode node : childNodes) {
        // 只处理子文件夹,跳过文件
        if (node.isFolder()) {
            // 导出当前文件夹的XML内容
            def xmlContent = admin.exportXml(node).content
            // 构造带ID的文件名,避免同名覆盖
            String xmlFileName = "${node.getName()}_ID${node.getId()}.xml"
            
            ZipEntry zipEntry = new ZipEntry(xmlFileName)
            zipStream.putNextEntry(zipEntry)
            // 写入XML内容到ZIP条目
            zipStream.write(xmlContent.getBytes("UTF-8"))
            zipStream.closeEntry()
        }
    }
    zipStream.finish()
    
    // 发送ZIP包给客户端
    sendFile(
        zipByteStream.toByteArray(),
        "${targetFolder.getName()}_Subfolders_XML.zip",
        "application/zip"
    )
} finally {
    // 确保流关闭
    zipStream.close()
    zipByteStream.close()
}

方案2:生成包含所有子文件夹内容的单个XML文件

如果你的需求是把所有子文件夹的XML内容合并到一个单独的XML文件里,我们可以构造一个统一的根节点,再把每个子文件夹的XML内容嵌入进去(注意清理重复的XML声明):

// 获取目标文件夹及其子节点
def targetFolder = docman.getFolder(129335)
def childNodes = targetFolder.getChildren()

// 构建合并后的XML内容
StringBuilder mergedXmlBuilder = new StringBuilder()
mergedXmlBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
mergedXmlBuilder.append("<subfolders_export folder_id=\"${targetFolder.getId()}\" folder_name=\"${targetFolder.getName()}\">\n")

for (CSNode node : childNodes) {
    if (node.isFolder()) {
        def rawXmlContent = admin.exportXml(node).content
        // 移除原XML的声明,避免单个文件出现多个声明导致格式错误
        String cleanedXml = rawXmlContent.replaceAll("^<\\?xml.*?\\?>", "").trim()
        
        // 把当前文件夹的XML内容作为子元素嵌入
        mergedXmlBuilder.append("  <folder_export folder_id=\"${node.getId()}\" folder_name=\"${node.getName()}\">\n")
        mergedXmlBuilder.append("    ${cleanedXml}\n")
        mergedXmlBuilder.append("  </folder_export>\n")
    }
}

mergedXmlBuilder.append("</subfolders_export>")

// 发送合并后的XML文件
sendFile(
    mergedXmlBuilder.toString().getBytes("UTF-8"),
    "${targetFolder.getName()}_All_Subfolders.xml",
    "application/xml"
)

额外提示

  • 两个方案都加了node.isFolder()判断,确保只处理子文件夹,避免误处理文件夹下的文件
  • 方案1里的文件名加入了文件夹ID,防止同名文件夹导致文件覆盖
  • 方案2里清理了原XML的声明部分,保证最终XML格式合法

内容的提问来源于stack exchange,提问作者Antilope

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:07:53