提供以下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>
答案 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元素开始。