我有一个安装网站的wix项目。其中一个步骤将几个xml标记添加到web.config文件中。每当添加xml标签时,WIX都会添加xmlns =""属性我不想要。
PluginSettings.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"/>
我做错了什么?
答案 0 :(得分:3)
WIX XmlConfig扩展使用MSXML修改目标计算机上的XML文件。特别是属性action =&#34; create&#34;和node =&#34; document&#34;,得到MSXML调用的简化序列:
selectSingleNode("//configuration/runtime/assemblyBinding")
<probing privatePath=\"IntegrityChecker\bin\" />
appendChild()
以附加新文档元素问题是探测元素没有名称空间,但父 assemblyBinding 元素具有名称空间"urn:schemas-microsoft-com:asm.v1"
。当MSXML添加探测元素时,会添加xmlns=""
以重置默认命名空间。如果没有xmlns=""
,探测元素会继承"urn:schemas-microsoft-com:asm.v1"
命名空间。
文章MSXML inserted blank namespaces描述了这种行为。不幸的是,本文(和其他人)建议在添加探测元素时更改调用序列以指定默认命名空间。由于这是WIX,我们无法轻易改变WIX使用MSXML的方式。
您可以尝试在探测元素中添加命名空间:
<?define PluginProbingPath="<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />" ?>
这将导致:
<probling xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />
我不是xml命名空间的专家,但显式xmlns="urn:schemas-microsoft-com:asm.v1"
的效果应该是良性的,因为探测元素现在将具有与其相同的默认命名空间parent assemblyBinding 。这是否适合解决取决于消耗xml的内容。