LINQ TO XML更新WIX补丁文件

本文关键字:补丁 文件 WIX 更新 TO XML LINQ | 更新日期: 2023-09-27 18:29:32

给出以下XML我正试图使用Linq将UpgradeImage和TargetImage SourceFile属性分别更新为XML。这个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>

LINQ TO XML更新WIX补丁文件

我猜您在查询时忘记提供名称空间了

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

使用这些xml扩展try,

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元素开始。