将XElement添加到XDocument时重复元素
作者:互联网
我正在用C#编写一个程序,它将通过一堆config.xml文件并更新某些元素,如果不存在则添加它们.我有下面的部分来更新元素(如果此代码存在):
XDocument xdoc = XDocument.Parse(ReadFile(_file));
XElement element = xdoc.Elements("project").Elements("logRotator")
.Elements("daysToKeep").Single();
element.Value = _DoRevert;
但是,当我想添加不存在的元素时遇到了问题.树的大部分时间都在适当的位置,当我使用代码时,它会添加另一棵相同的树,这会导致读取xml的程序崩溃.
这是我试图做到的
xdoc.Element("project").Add(new XElement("logRotator", new XElement("daysToKeep", _day)));
并导致这样的结构(numToKeep标签已经存在):
<project>
<logRotator>
<daysToKeep>10</daysToKeep>
</logRotator>
<logRotator>
<numToKeep>13</numToKeep>
</logRotator>
</project>
但这就是我想要的
<project>
<logRotator>
<daysToKeep>10</daysToKeep>
<numToKeep>13</numToKeep>
</logRotator>
</project>
解决方法:
这将查找给定项目的logRotator元素(如果存在),如果不存在则创建该元素.
// project is XElement
XElement logRotator = project.Element("logRotator");
if (logRotator == null)
{
logRotator = new XElement("logRotator");
project.Add(logRotator);
}
logRotator.Add(new XElement("daysToKeep", someValue));
为了实现可重用性(如果存在其他可能存在或不存在的元素),可以将其提取到方法中.
static void AddToElement(XElement outerParent, string innerParent, string name, object value)
{
XElement inner = outerParent.Element(innerParent);
if (inner == null)
{
inner = new XElement(innerParent);
outerParent.Add(inner);
}
inner.Add(new XElement(name, value));
}
简单测试
string xml = @"<project>
<logRotator>
<numToKeep>13</numToKeep>
</logRotator>
</project>";
XDocument document = XDocument.Parse(xml);
XElement project = document.Element("project");
AddToElement(project, "logRotator", "daysToKeep", 10);
Console.WriteLine(document.ToString());
标签:linq-to-xml,linq,xml,c 来源: https://codeday.me/bug/20191210/2098467.html