C#用新属性和子节点替换XML节点

时间:2016-02-15 14:21:55

标签: c# xml

我有这个xml文件:

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>

我需要更换&lt;启动&gt;节点:

gathered[gath]

这是最好的方式吗?

2 个答案:

答案 0 :(得分:2)

如果使用LINQ to XML(它是XML API而不是LINQ):

XDocument doc = XDocument.Load("dat.xml");

XElement startup1 = doc.Root.Element("startup");
startup1.Remove();

doc.Root.Add(new XElement("startup", new XAttribute("useLegacyV2RuntimeActivationPolicy", "true"),
                               new XElement("supportedRuntime", new XAttribute("version", "v4.0"),
                               new XAttribute("sku", ".NETFramework"),
                               new XAttribute("Version", "v4.5.2"))));

doc.Save("dat.xml");

编辑 - 正如Jon Skeet所建议的那样,正确的方法应该是使用XElement.ReplaceWith

XDocument doc = XDocument.Load("dat.xml");

XElement startup1 = doc.Root.Element("startup");           
startup1.ReplaceWith(new XElement("startup", new XAttribute("useLegacyV2RuntimeActivationPolicy", "true"),
                               new XElement("supportedRuntime", new XAttribute("version", "v4.0"),
                               new XAttribute("sku", ".NETFramework"),
                               new XAttribute("Version", "v4.5.2"))));

doc.Save("dat.xml");

答案 1 :(得分:0)

您可以使用以下代码执行相同的操作,其中元素正在被查找,并且被替换为其他元素。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("path to your file");

string strXml = 
  @"<startup useLegacyV2RuntimeActivationPolicy='true'>
    <supportedRuntime version='v4.0' sku='.NETFramework,Version=v4.5.2' />
</startup>";
XmlDocumentFragment xmlDocFragment = xmlDoc.CreateDocumentFragment();
xmlDocFragment.InnerXml = strXml;
xmlDoc.SelectSingleNode("startup").AppendChild(xmlDocFragment);

更新:使用LINQ。使用经过测试的代码

var doc = XDocument.Load(@"path to file");
string input = @"<startup useLegacyV2RuntimeActivationPolicy='true'>
<supportedRuntime version='v4.0' sku='.NETFramework,Version=v4.5.2' />
</startup>";
var replacement = XElement.Parse(input);
var nodeToReplace = doc.Descendants().Elements("startup").FirstOrDefault();
nodeToReplace.ReplaceWith(replacement);
doc.Save(@"path to file");
Console.WriteLine(doc);
Console.Read();