如何使用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
相关产品推荐
相关产品推荐

