WIX如何删除xmlns =""标签

时间:2014-10-09 15:11:55

标签: wix wix3.7 wix-extension

我有一个安装网站的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"/>

我做错了什么?

1 个答案:

答案 0 :(得分:3)

WIX XmlConfig扩展使用MSXML修改目标计算机上的XML文件。特别是属性action =&#34; create&#34;和node =&#34; document&#34;,得到MSXML调用的简化序列:

  1. selectSingleNode("//configuration/runtime/assemblyBinding")
  2. <probing privatePath=\"IntegrityChecker\bin\" />
  3. 创建新的xml文档
  4. 获取顶级文档元素
  5. 致电appendChild()以附加新文档元素
  6. 问题是探测元素没有名称空间,但父 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的内容。