gramcha
gramcha

Reputation: 732

Replace values in xml using ANT

I want to replace the ProductVersion value at <DefineConstants> node of the following xml. Remaining part of the line has to be preserved. Example:

<DefineConstants>XXXXX;ProductVersion=20.323.23;YYYYY</DefineConstants>

to

<DefineConstants>XXXXX;ProductVersion=21.58.44;YYYYY</DefineConstants>

I tried the replaceregexp but it changes the remaining contents.

<replaceregexp file="${basedir}\Installer.wixproj"
     match="ProductVersion=([0-9].*);(.*)"
     replace="ProductVersion=${SpaceVersion};\1"
     byline="true"
/>

Could you guide me what i am doing wrong in this.

XML:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
      <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
      <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
      <ProductVersion>3.5</ProductVersion>
      <ProjectGuid>{6bc0a85b-9c15-41e6-874b-5fe07e5338e6}</ProjectGuid>
      <SchemaVersion>2.0</SchemaVersion>
      <OutputName>Installer</OutputName>
      <OutputType>Package</OutputType>
      <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
      <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
      <OutputPath>bin\$(Configuration)\</OutputPath>
      <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
      <DefineConstants>Debug;</DefineConstants>
      <WixVariables>
      </WixVariables>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
      <OutputPath>bin\$(Configuration)\</OutputPath>
      <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
      <DefineConstants>SourceDir=$(SolutionDir)XSSE\;ProductVersion=3.3.1.75;ProductName=XSSE;ToolchinShortcut=XSSEToolchinShortcut;ExtensionDir=XSSE;ManifestFileName=extension.vsixmanifest;PkageDefFileName=XSSE.ToolchainProvider.pkgdef;REGKEY=Software\Microsoft\XSSE;</DefineConstants>
      <WixVariables>XYZ=123;</WixVariables>
   </PropertyGroup>
   <ItemGroup>
      <Compile Include="filefragment.wxs" />
      <Compile Include="Product.wxs" />
   </ItemGroup>
   <ItemGroup>
      <WixExtension Include="WixUIExtension">
         <HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
         <Name>WixUIExtension</Name>
      </WixExtension>
   </ItemGroup>
   <Import Project="$(WixTargetsPath)" /> 

Upvotes: 0

Views: 922

Answers (2)

ewan.chalmers
ewan.chalmers

Reputation: 16235

You need to use \2 instead of \1.

<replaceregexp file="${basedir}\Installer.wixproj"
       match="ProductVersion=([0-9].*);(.*)"
       replace="ProductVersion=${SpaceVersion};\2"
       byline="true"
        />

Standalone test:

<project default="test">

    <property name="SpaceVersion" value="a.b.c"/>

    <target name="test">
      <replaceregexp file="test.xml"
         match="ProductVersion=([0-9].*);(.*)"
         replace="ProductVersion=${SpaceVersion};\2"
         byline="true"
       />
    </target>
</project>

Comparison of changed file with original:

$diff test.xml test.xml.0
2c2
<     <DefineConstants>XXXXX;ProductVersion=a.b.c;YYYYY</DefineConstants>
---
>     <DefineConstants>XXXXX;ProductVersion=20.323.23;YYYYY</DefineConstants>

Upvotes: 0

BunjiquoBianco
BunjiquoBianco

Reputation: 2034

I think trying to capture the remainder of the line after the product version is unnecessary.

You don't need to worry about that. If your regex leaves the rest of the text alone, you can just replace the ProductVersion only.

I had success with this:

<replaceregexp file="${basedir}\Installer.wixproj"
    match="ProductVersion=[0-9]+\.?[0-9]+\.?[0-9]+\.?[0-9]+\.?;"
    replace="ProductVersion=${SpaceVersion};"
    byline="true"
    />

Upvotes: 1

Related Questions