使用WiX Toolset v4 util:XmlFile修改NLog.config遇ICE03错误求助
WiX v4 util:XmlFile修改NLog.config的ICE03错误解决
错误原因
ICE03错误核心是XML命名空间未正确处理。你的NLog.config根元素<nlog>带有命名空间xmlns="http://www.nlog-project.org/schemas/NLog.xsd",而你使用的XPath/nlog/targets/target[1]/@fileName未考虑命名空间——WiX的util:XmlFile对命名空间的处理比在线XPath测试器更严格,未指定命名空间的XPath会被判定为无效格式。
ElementPath的问题
原路径未处理命名空间,导致WiX无法定位目标元素,有两种修正方式:
- 使用
local-name()匹配元素(无需额外配置命名空间):ElementPath="/*[local-name()='nlog']/*[local-name()='targets']/*[local-name()='target'][1]/@fileName" - 为
util:XmlFile指定Namespace属性:<util:XmlFile Id="editNLogConfig" File="[INSTALLFOLDER]NLog.config" Action="setValue" ElementPath="/nlog/targets/target[1]/@fileName" Namespace="http://www.nlog-project.org/schemas/NLog.xsd" Value="[ENVIMPORTDIR][IMPPART1]" />
Value的问题
你的Value设置存在两处错误:
- WiX中引用属性的语法是
[PROPERTY_NAME],而非${[PROPERTY_NAME]},所以${[ENVIMPORTDIR]}应改为[ENVIMPORTDIR]。 - 错误将
layout属性内容拼接到fileName中——NLog的<target>元素里,fileName和layout是独立属性,不能混写。你原本需求是修改日志目录,无需改动layout,Value只需设置为[ENVIMPORTDIR][IMPPART1]即可。
更贴合需求的最优方案
你实际要替换的是NLog的logDirectory变量,直接修改<variable>元素的value属性比修改fileName更简洁,也避免后续NLog配置变更时重复修改:
修正后的WiX代码
<util:XmlFile Id="updateLogDirectory" File="[INSTALLFOLDER]NLog.config" Action="setValue" ElementPath="/*[local-name()='nlog']/*[local-name()='variable'][@name='logDirectory']/@value" Value="[ENVIMPORTDIR]" />
只需传入ENVIMPORTDIR属性值(注意修正为标准UNC路径\\ttt-filer.tt.yy\sdf\uer\qar\sdf2),NLog会自动用新的logDirectory变量拼接原有fileName路径,无需改动target的其他属性。
内容的提问来源于stack exchange,提问作者NadjaL
相关产品推荐
相关产品推荐

