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

如何使用Inno Setup移除XmlDocument中的注释标签还原节点

错误原因

你遇到的报错是因为错误使用了createElement方法:该方法仅接受纯元素名称作为入参(例如'endpoint'),不能传入包含标签属性、换行、嵌套结构的完整XML片段,因此触发了非法字符校验错误。

解决方案

Inno Setup依赖MSXML组件操作XML,你可以通过临时DOM对象加载注释内的XML片段,再导入到原文档替换注释节点即可,完整实现代码如下:

var
  XMLDoc: Variant;
  XMLCommentNode: Variant;
  TempDoc: Variant;
  ImportedNode: Variant;
  APath: String;
begin
  // 此处省略你原有的XMLDoc初始化、加载XML文件的逻辑
  APath := '//configuration/system.serviceModel/services/service/comment()';
  XMLCommentNode := XMLDoc.selectSingleNode(APath);

  if not VarIsNull(XMLCommentNode) and not VarIsClear(XMLCommentNode) then
  begin
    Log('找到目标注释节点,内容为:' + XMLCommentNode.Text);
    // 创建高版本临时DOM对象加载XML片段,避免老版本兼容问题
    TempDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
    TempDoc.async := False;
    TempDoc.validateOnParse := False;
    
    // 加载注释内的XML内容
    if TempDoc.loadXML(XMLCommentNode.Text) then
    begin
      // 将临时DOM的节点导入原文档,避免跨DOM操作报错
      ImportedNode := XMLDoc.importNode(TempDoc.documentElement, True);
      // 替换原注释节点
      XMLCommentNode.parentNode.replaceChild(ImportedNode, XMLCommentNode);
      Log('注释节点已成功替换为有效XML节点');
      // 操作完成后调用 XMLDoc.save(你的XML文件路径) 保存修改即可
    end
    else
    begin
      Log('加载注释内XML片段失败,错误原因:' + TempDoc.parseError.reason);
    end;
  end;
end;
补充注意事项
  • 代码中指定使用Msxml2.DOMDocument.6.0版本,比系统默认的msxml3稳定性、兼容性更好,建议加载原XML文档时也使用该版本的组件
  • 如果注释内包含多个平级的XML节点,可在加载时给内容前后拼接临时根标签:TempDoc.loadXML('<temp>' + XMLCommentNode.Text + '</temp>'),之后遍历TempDoc.documentElement.childNodes逐个导入替换即可
  • 所有节点操作完成后必须调用save方法才能把修改写入到本地XML文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:54:00