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>
我猜您在查询时忘记提供名称空间了
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元素开始。