WIX 如何删除 xmlns= " "标签



我有一个安装网站的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调用的简化序列:

  1. selectSingleNode("//configuration/runtime/assemblyBinding")
  2. 从以下位置创建新的xml文档:<probing privatePath="IntegrityCheckerbin" />
  3. 获取顶级文档元素
  4. 调用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的内容。

相关内容

  • 没有找到相关文章

最新更新