我有一个安装网站的wix项目。其中一个步骤将几个xml标记添加到web.config文件中。每当添加xml标记时,WIX都会添加我不想要的xmlns="属性。
插件设置.wxi
<?xml version="1.0" encoding="utf-8"?>
<Include>
...
<?define PluginProbingPath="<probing privatePath="IntegrityCheckerbin" />" ?>
</Include>
配置文件.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="IntegrityCheckerbin"/></assemblyBinding>
</runtime>
正如你所看到的,我没有指定xmlns标签(我不想要)
我试着用额外的标签删除这个属性,但它不起作用:
<util:XmlFile Id="AppConfigAddPlugin8" Action="deleteValue" Permanent="yes" File="[INSTALLDIR]web.config"
ElementPath="//configuration/runtime/assemblyBinding/probing" Name="xmlns" Sequence = "2"/>
我做错了什么?
WIX XmlConfig扩展使用MSXML修改目标计算机上的XML文件。具体地,属性action="action";创建";并且节点="0";文档";,结果是MSXML调用的简化序列:
selectSingleNode("//configuration/runtime/assemblyBinding")
- 从以下位置创建新的xml文档:
<probing privatePath="IntegrityCheckerbin" />
- 获取顶级文档元素
- 调用
appendChild()
以附加新的文档元素
问题是探测元素没有名称空间,但父元素assemblyBinding具有命名空间"urn:schemas-microsoft-com:asm.v1"
。当MSXML添加探测元素时,会添加xmlns=""
以重置默认命名空间。如果没有xmlns=""
,探测元素将继承"urn:schemas-microsoft-com:asm.v1"
命名空间。
MSXML插入空白名称空间这篇文章描述了这种行为。不幸的是,本文(以及其他文章)建议在添加探测元素时更改调用序列以指定默认名称空间。由于这是WIX,我们无法轻易更改WIX使用MSXML的方式。
您可以尝试向探测元素添加一个命名空间:
<?define PluginProbingPath="<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityCheckerbin" />" ?>
这将导致:
<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityCheckerbin" />
我不是xml名称空间方面的专家,但显式xmlns="urn:schemas-microsoft-com:asm.v1"
的效果应该是良性的,因为探测元素现在将具有与其父assemblyBinding相同的默认名称空间。这是否是一个合适的解决方案取决于使用xml的内容。