能否通过Inno Setup在编译时自动创建XML数据库?
可以用Inno Setup实现该需求
下面是具体的实现方案,核心是利用Inno Setup的Pascal脚本在编译阶段处理文件并生成目标XML:
实现步骤与代码
- 编写Pascal脚本,在编译时遍历指定的XML数据库文件
- 从文件名提取语言代码,读取XML文件中的Version属性
- 动态生成目标XML结构并保存到指定路径
完整示例代码
[Setup] AppName=Public Talks Update Installer AppVersion=1.0 DefaultDirName={pf}\PublicTalks OutputDir=Output [Files] Source: "MSA_PublicTalks_???.xml"; DestDir: "{param:InstallPath}"; Flags: ignoreversion [Code] procedure InitializeSetup; var SourcePath, FileName, LangCode, VersionStr: String; SearchRec: TSearchRec; XmlDoc, RootNode, DbNode: Variant; begin // 设置源文件路径(对应安装程序中的源文件目录) SourcePath := ExpandConstant('{src}'); // 创建XML文档对象 XmlDoc := CreateOleObject('MSXML2.DOMDocument.6.0'); XmlDoc.async := False; XmlDoc.preserveWhiteSpace := True; // 创建根节点 RootNode := XmlDoc.createElement('PublicTalkTitleUpdates'); XmlDoc.appendChild(RootNode); // 遍历所有符合命名规则的XML文件 if FindFirst(SourcePath + '\MSA_PublicTalks_*.xml', faAnyFile, SearchRec) = 0 then begin repeat FileName := SearchRec.Name; // 提取语言代码:从文件名中截取对应位置的字符 LangCode := LowerCase(Copy(FileName, Length('MSA_PublicTalks_') + 1, 3)); // 读取XML文件中的Version属性 if XmlDoc.Load(SourcePath + '\' + FileName) then begin VersionStr := XmlDoc.documentElement.getAttribute('Version'); // 创建Database节点并设置属性 DbNode := XmlDoc.createElement('Database'); DbNode.setAttribute('Language', LangCode); DbNode.setAttribute('Version', VersionStr); RootNode.appendChild(DbNode); end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; // 保存生成的XML文件到指定路径(示例为编译输出目录) XmlDoc.Save(ExpandConstant('{output}\PublicTalkTitleUpdates.xml')); end;
代码说明
- 遍历文件:使用
FindFirst/FindNext遍历源目录下所有符合命名规则的XML文件 - 提取语言代码:通过字符串截取从文件名中提取3位语言代码,并转为小写格式
- 读取版本号:利用MSXML对象加载XML文件,读取根节点的
Version属性值 - 生成XML:动态构建目标XML的节点结构,最终保存到指定路径
注意事项
- 编译环境需确保存在MSXML 6.0(Windows系统默认自带该组件)
- 若文件名中的语言代码长度不是3位,需调整字符串截取的参数
- 可根据实际需求修改生成XML的保存路径,比如直接指定到网站发布目录
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

