ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

将XElement添加到XDocument时重复元素

2019-12-10 02:08:20  阅读:259  来源: 互联网

标签:linq-to-xml linq xml c


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有