WIX 如何删除 xmlns="" 标签
Posted
技术标签:
【中文标题】WIX 如何删除 xmlns="" 标签【英文标题】:WIX how to remove xmlns="" tag 【发布时间】:2014-10-09 15:11:54 【问题描述】:我有一个安装网站的 wix 项目。其中一个步骤将几个 xml 标记添加到 web.config 文件。每当添加 xml 标签时,WIX 都会添加我不想要的 xmlns="" 属性。
插件设置.wxi
<?xml version="1.0" encoding="utf-8"?>
<Include>
...
<?define PluginProbingPath="<probing privatePath="IntegrityChecker\bin\" />" ?>
</Include>
ConfigFiles.wxs
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?include PluginSettings.wxi ?>
<Fragment>
<!-- WEB.CONFIG -->
<Component Id="Web.ConfigPortal" Guid="3ED81B77-F153-4003-9006-4770D789D4B7" Directory ="INSTALLDIR">
<CreateFolder/>
...
<util:XmlConfig Id = "AppConfigAddPlugin1" ElementPath = "//configuration/runtime/assemblyBinding" Action = "create" Node = "document"
On = "install" File = "[INSTALLDIR]web.config" Value = "$(var.PluginProbingPath)" Sequence = "1"/>
</Component>
</Fragment>
</Wix>
这会导致 web.config 在安装后出现此问题:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0"/>
</dependentAssembly>
<probing xmlns="" privatePath="IntegrityChecker\bin\"/></assemblyBinding>
</runtime>
正如你所见,我没有指定 xmlns 标记(我不想要)。
我尝试使用附加标签删除该属性,但它不起作用:
<util:XmlFile Id="AppConfigAddPlugin8" Action="deleteValue" Permanent="yes" File="[INSTALLDIR]web.config"
ElementPath="//configuration/runtime/assemblyBinding/probing" Name="xmlns" Sequence = "2"/>
我做错了什么?
【问题讨论】:
【参考方案1】:WIX XmlConfig 扩展使用 MSXML 修改目标计算机上的 XML 文件。具体而言,属性 action="create" 和 node="document" 会导致这个 MSXML 调用的简化序列:
selectSingleNode("//configuration/runtime/assemblyBinding")
从以下位置创建新的 xml 文档:<probing privatePath=\"IntegrityChecker\bin\" />
获取***文档元素
调用appendChild()
追加新的文档元素
问题是 probing 元素没有命名空间,但父 assemblyBinding 元素具有命名空间 "urn:schemas-microsoft-com:asm.v1"
。当 MSXML 添加 probing 元素时,会添加 xmlns=""
以重置默认命名空间。如果没有xmlns=""
,probing 元素会继承"urn:schemas-microsoft-com:asm.v1"
命名空间。
文章MSXML inserted blank namespaces 描述了这种行为。不幸的是,这篇文章(和其他文章)建议在添加 probing 元素时更改调用顺序以指定默认命名空间。由于这是 WIX,我们无法轻易更改 WIX 使用 MSXML 的方式。
您可以尝试向 probing 元素添加命名空间:
<?define PluginProbingPath="<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />" ?>
这将导致:
<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />
我不是 xml 命名空间方面的专家,但显式 xmlns="urn:schemas-microsoft-com:asm.v1"
的效果应该是良性的,因为 probing 元素现在将具有与其父 相同的默认命名空间装配绑定。这是否是一个合适的解决方法取决于使用 xml 的内容。
【讨论】:
以上是关于WIX 如何删除 xmlns="" 标签的主要内容,如果未能解决你的问题,请参考以下文章
WiX Bootstrapper:如何从命令行设置刻录变量?
使用 DataContractSerializer 时删除 xmlns:i="http://www.w3.org/2001/XMLSchema-instance"