c# - 将 XElement 添加到 XDocument 时出现重复元素

标签 c# xml linq linq-to-xml

我正在用 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());

关于c# - 将 XElement 添加到 XDocument 时出现重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007141/

相关文章:

java - 忽略 XML 文件中的 SOAP 标记

java - 如何使用 apache poi 4.1.0 创建带有 `WorkbookFactory` 的工作簿

c# - 使用 linq to xml 获取特定值

C# GroupBy 和 Average 嵌套字典

c# - .Net 的 Java AST 解析器

c# - 如何不需要将 ICollection 替换为 TT 文件中的 ObservableCollection?

Android 支持 BottomSheetBehavior 不能动态?

c# - 从通用 List<t> 中删除项目

c# - 如何在使用 VSTS(单元测试适配器)运行测试时生成 NUnit XML 报告

c# - 为什么我不允许在返回 IAsyncEnumerable 的方法中返回 IAsyncEnumerable