Reputation: 20179
Give the following XML I'm trying to update the UpgradeImage and TargetImage SourceFile attributes respectively using Linq to XML. Is there an issue with the way this XML is formed or am I just completely missing something?
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<PatchCreation
Id="224C316C-5894-4771-BABF-21A3AC1F75FF"
CleanWorkingFolder="yes"
OutputPath="patch.pcp"
WholeFilesOnly="yes">
<PatchInformation
Description="Update Patch"
Comments="Update Patch"
ShortNames="no"
Languages="1033"
Compressed="yes"
Manufacturer="me"/>
<PatchMetadata
AllowRemoval="yes"
Description="Update Patch"
ManufacturerName="me"
TargetProductName="Update"
MoreInfoURL="http://andrewherrick.com/"
Classification="Update"
DisplayName="Update Patch"/>
<Family DiskId="5000"
MediaSrcProp="Sample"
Name="Update"
SequenceStart="5000">
<UpgradeImage SourceFile="c:\new.msi" Id="PatchUpgrade">
<TargetImage SourceFile="c:\old.msi" Order="2" Id="PatchUpgrade" IgnoreMissingFiles="no" />
</UpgradeImage>
</Family>
<PatchSequence PatchFamily="SamplePatchFamily"
Sequence="1.0.0.0"
Supersede="yes" />
</PatchCreation>
</Wix>
Upvotes: 0
Views: 409
Reputation: 11955
Using these xml extensions try,
XElement wix = XElement.Load("file");
wix.Set("PatchCreation/Family/UpgradeImage/SourceFile", "new file path", true)
.Set("TargetImage/SourceFile", "new file path", true);
The extensions will automatically get the namespace for you. Set() returns the XElement of the element that the attribute was set on. So the second Set() starts from the UpgradeImage element.
Upvotes: 1
Reputation: 43011
I'm guessing you forgot to supply the namespace when querying
XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi";
var doc = XDocument.Load(@"C:\test.xml");
var ui = doc.Elements(ns + "Wix").Elements(ns + "PatchCreation").
Elements(ns + "Family").Elements(ns + "UpgradeImage").Single ();
ui.Attribute("SourceFile" ).Value = "c:\newer.msi";
doc.Save(@"C:\test2.xml");
Edit
An alternative is to use the XPathSelectElement extension method
XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
mgr.AddNamespace("ns", "http://schemas.microsoft.com/wix/2006/wi");
var el = doc.Root.XPathSelectElement("//ns:Wix/ns:PatchCreation/ns:Family/ns:UpgradeImage", mgr);
el.Attribute("SourceFile").Value = @"c:\evennewer.msi";
Upvotes: 1