LINQ TO XML Update WIX PATCH File

风格不统一 提交于 2019-12-12 03:13:50

问题


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>

回答1:


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



回答2:


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.



来源:https://stackoverflow.com/questions/9933578/linq-to-xml-update-wix-patch-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!