.\DebugTandem\
.\DebugTandem\
fred$(ProjectName)
.\../../products/bin/ReleaseDLL\
.\ReleaseDLL\
false
fred$(ProjectName)
.\../../products/bin/ReleaseDLL\
.\ReleaseDLL\
false
fred$(ProjectName)
####
use strict;
use warnings;
use XML::LibXML;
use XML::LibXML::XPathContext;
sub read_file_contents
{
my $fname = shift;
open( my $fh, '<', $fname ) or die "error: open '$fname': $!\n";
binmode $fh;
local $/ = undef; # slurp mode
my $s = <$fh>;
close($fh);
return $s;
}
sub write_file_contents
{
my ( $fname, $data ) = @_;
my $overw = -e $fname ? " (overwriting)" : "";
print "creating '$fname'$overw...";
open( my $fh, '>', $fname ) or die "error: open '$fname': $!";
binmode($fh);
print {$fh} $data or die "error: write '$fname': $!";
close($fh);
print "done.\n";
}
my $fname = shift or die "usage: $0 fname\n";
print "xml file : '$fname'\n";
my $xmlstring = read_file_contents($fname);
# XXX: Hack for utf8 BOM.
# my $UTF8_BOM = chr(0xef) . chr(0xbb) . chr(0xbf);
my $UTF8_BOM = "";
# XXX: Without this damned billygates namespace I could not get XPath to work.
my $xpath_ns = 'billygates';
my $vs2010_ns = 'http://schemas.microsoft.com/developer/msbuild/2003';
my $outfile = 'fred.tmp';
my $proj = 'Release DLL|Win32';
my $targ = 'ReleaseDLL';
my $repl = 'ReleaseDLL32';
my $query = "PropertyGroup[contains(\@Condition,'$proj')]";
my $ns_query = "//$xpath_ns:$query";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xmlstring);
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs( $xpath_ns => $vs2010_ns );
print "query : $ns_query:\n";
for my $q ( $xc->findnodes($ns_query) )
{
print $q->nodeName(), ":\n";
for my $c ( $q->childNodes() )
{
my $name = $c->nodeName();
my $val = $c->textContent();
print " ", ref($c), ":", $name, ":\n";
if ( defined($val) && $val =~ m{[/\\](?:$targ)[/\\]} )
{
print " $name: val=$val: matches '$targ'\n";
for my $t ( $c->childNodes() )
{
my $v = $t->data;
print " ", ref($t), ":", $t->nodeName(), ":", $v, ":\n";
print " old:", $v, ":\n";
$v =~ s{([/\\])$targ([/\\])}{$1$repl$2} or die "oops";
$t->setData($v);
print " new:", $v, ":\n";
}
}
}
}
write_file_contents( $outfile, $UTF8_BOM . $doc->toString(0) );
##
##
$ perl txml1.pl fred.vcxproj
xml file : 'fred.vcxproj'
query : //billygates:PropertyGroup[contains(@Condition,'Release DLL|Win32')]:
PropertyGroup:
XML::LibXML::Text:#text:
XML::LibXML::Element:OutDir:
OutDir: val=.\../../products/bin/ReleaseDLL\: matches 'ReleaseDLL'
XML::LibXML::Text:#text:.\../../products/bin/ReleaseDLL\:
old:.\../../products/bin/ReleaseDLL\:
new:.\../../products/bin/ReleaseDLL32\:
XML::LibXML::Text:#text:
XML::LibXML::Element:IntDir:
IntDir: val=.\ReleaseDLL\: matches 'ReleaseDLL'
XML::LibXML::Text:#text:.\ReleaseDLL\:
old:.\ReleaseDLL\:
new:.\ReleaseDLL32\:
XML::LibXML::Text:#text:
XML::LibXML::Element:LinkIncremental:
XML::LibXML::Text:#text:
XML::LibXML::Element:TargetName:
XML::LibXML::Text:#text:
creating 'fred.tmp' (overwriting)...done.
$ diff fred.vcxproj fred.tmp
2c2
<
---
>
9,10c9,10
< .\../../products/bin/ReleaseDLL\
< .\ReleaseDLL\
---
> .\../../products/bin/ReleaseDLL32\
> .\ReleaseDLL32\