LINQ TO XML更新WIX PATCH文件

时间:2012-03-29 21:09:00

标签: c# wix linq-to-xml

提供以下XML我正在尝试使用Linq to XML分别更新UpgradeImage和TargetImage SourceFile属性。这个XML的形成方式是存在问题,还是我完全错过了什么?

<?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>

2 个答案:

答案 0 :(得分:1)

我猜你在查询时忘了提供命名空间

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

修改

另一种方法是使用XPathSelectElement扩展方法

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

答案 1 :(得分:1)

使用these xml extensions尝试,

XElement wix = XElement.Load("file");
wix.Set("PatchCreation/Family/UpgradeImage/SourceFile", "new file path", true)
   .Set("TargetImage/SourceFile", "new file path", true);

扩展程序会自动为您获取命名空间。 Set()返回设置该属性的元素的XElement。所以第二个Set()从UpgradeImage元素开始。