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 文档:&lt;probing privatePath=\"IntegrityChecker\bin\" /&gt; 获取***文档元素 调用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="" 标签的主要内容,如果未能解决你的问题,请参考以下文章

Linq to Xml:删除命名空间

WiX Bootstrapper:如何从命令行设置刻录变量?

如何使用 WiX 安装程序更改添加/删除程序名称?

使用 DataContractSerializer 时删除 xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

从输出元素中删除 xmlns=""

在链中执行 MSI 文件时,如何阻止 WiX 传递 ARPSYSTEMCOMPONENT="1"?