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
相关产品推荐
相关产品推荐

