6

I am moving from a Wise Installer to WIX and am using the util:xmlfile to update a configuration xml file.

This works.

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prodconfig.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[INSTALLDIR]prodconfig.xml"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

This does not work.

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prod-config.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[INSTALLDIR]prod-config.xml"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

When the .msi executes with the first component, everything is fine. In the second version, an error is returned "Error 25531. Failed to open XML file..."

As far as I can tell the only difference is the hyphen in the file name.

Any suggestions as to what the difference might be?

Val
  • 252
  • 9
  • 19

2 Answers2

9

Try using the file's id instead of hard-coding the name

[#config] //which will refer to the File Id

instead of

[INSTALLDIR]prod-config.xml
Chris Bednarski
  • 3,364
  • 25
  • 33
  • That did it! I know comments that say "Thanks" aren't supposed to be written, but I would not have thought of that as being the difference so... thanks a million. It makes sense since hyphens aren't permitted in IDs. – Val Feb 17 '14 at 16:24
  • Chris, in your answer you state alternately that the File attribute should use the Component's Id and the File's Id. The Component's Id didn't but the File's Id does. – Jade Mar 21 '18 at 03:04
0

The value for the File attribute for util:XmlFile tag should refer to the Id attribute for the File tag.

In your case this would be

<Component Id="config" Guid="*">
  <File Id="config" Source="..\Source\Desktop\prod-config.xml" KeyPath="yes" Vital="yes" />
    <util:XmlFile 
      Id="_PORT_" File="[#config]"  
      Action="setValue" 
      Name="Port" Value="[PORT]" 
      ElementPath="//Configuration/CommConnectionPools/CommConnectionPool" 
      Sequence='1' />
  </File>
</Component>

In your example since you use the same identifier for both the Component tag and the File tag it doesn't matter. But in general you need to use the Id for the File tag.

To clarify, if your example used configComponent and configFile respectively for Component and File identifiers. It would look like the following:

<Component Id="configComponent" Guid="*">
  <File Id="configFile" Source="..\Source\Desktop\prod-config.xml" />
    <util:XmlFile 
      Id="_PORT_" File="[#configFile]"  
[snip]
     />
  </File>
</Component>
Jade
  • 3,156
  • 1
  • 34
  • 44