简体   繁体   中英

WIX how to remove xmlns=“” tag

I have a wix project that installs a web site. One of the steps adds several xml tags to web.config file. Whenever adding xml tags WIX adds xmlns="" attribute which I don't want.

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>

Which results in web.config having this after install:

 <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>

As you can see nowhere did I specify xmlns tag (which I DON"T want).

I've tried removing that attribute with additional tag but it doesn't work:

    <util:XmlFile Id="AppConfigAddPlugin8" Action="deleteValue" Permanent="yes" File="[INSTALLDIR]web.config"
        ElementPath="//configuration/runtime/assemblyBinding/probing" Name="xmlns" Sequence = "2"/>

what am I doing wrong?

The WIX XmlConfig extension uses MSXML to modify the XML file on the target computer. Specifically the attributes action="create" and node="document", results in this simplified sequence of MSXML calls:

  1. selectSingleNode("//configuration/runtime/assemblyBinding")
  2. Create new xml document from: <probing privatePath=\\"IntegrityChecker\\bin\\" />
  3. Get the top level document element
  4. call appendChild() to append the new document element

The problem is the probing element has no name space, but the parent assemblyBinding element has the namespace "urn:schemas-microsoft-com:asm.v1" . When MSXML adds the probing element, xmlns="" is added to reset the default namespace. Without xmlns="" , the probing element inherits the "urn:schemas-microsoft-com:asm.v1" namespace.

The article, MSXML inserted blank namespaces , describes this behaviour. Unfortunately this article (and others) recommend changing the call sequence to specify a default namespace when adding the probing element. Since this is WIX we can't easily change how WIX uses MSXML.

You could try adding a namespace to the probing element:

<?define PluginProbingPath="<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />" ?>

This will result in:

<probing xmlns="urn:schemas-microsoft-com:asm.v1" privatePath="IntegrityChecker\bin\" />

I'm not an expert on xml namespaces, but the effect of the explicit xmlns="urn:schemas-microsoft-com:asm.v1" should be benign in that the probing element will now have the same default namespace as its parent assemblyBinding . Whether this is a suitable work around depends on what is consuming the xml.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM