c# - 如何在不导致无限循环的情况下向 XML 文件添加数据

标签 c# xml linq

我有一个如下所示的 XML 文件: 我正在尝试添加新书,但很明显,我陷入了无限循环。如果不重新评估查询中的书籍,我该如何做到这一点。看来我正在附加文件然后重新评估导致问题。 我尝试使用 for 循环 进行迭代,但没有得到想要的结果。

<?xml version="1.0"?>
<catalog>
<item>
   <book>
      <author>Ralls, Kim</author>
      <title>XML Developer's Guide</title>
   </book>
</item>

<item>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
   </book>
</item>
</catalog>

我需要在两个项目节点中添加一本书,以便每个项目根据作者共有两本书。

结果将如下所示:

<?xml version="1.0"?>
<catalog>
<item>
   <book>
      <author>Ralls, Kim</author>
      <title>XML Developer's Guide</title>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>C# Developer's Guide</title>
   </book>
</item>

<item>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>C# Developer's Guide</title>
   </book>
</item>
</catalog>

代码:

        XElement root = XElement.Load(@"C:\source\catalog.xml");
        IEnumerable<XElement> books =
        from el in root.Descendants("book")
       where el.Element("author").Value == "Ralls, Kim"

        select el;

        foreach (XElement el in books)
        {
            el.AddAfterSelf
            (
            new XElement
            (
                "book", new XElement("author", "Ralls, Kim"),
                        new XElement("title", "C# Developer's Guide")
            )

            );

            Console.WriteLine(el.Value);
        }

        root.Save(@"C:\dest\catalog.xml");

最佳答案

将您的代码更新为:

List<XElement> books =
    (from el in root.Descendants("book")
    where el.Element("author").Value == "Ralls, Kim"
    select el).ToList();

如果我没看错,应该可以解决问题。

重要的部分是 ToList(),它使 linq 查询仅计算一次并将该初始结果用于所有后续用例。

关于c# - 如何在不导致无限循环的情况下向 XML 文件添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54738640/

相关文章:

绑定(bind)到前缀的XML模式导入-vs-命名空间

java - 无法解析 "Manifest merger failed : Attribute application@appComponentFactory"

java - 充气失败

c# - 添加 .ToArray 或 .ToList 是否总能使数据库查询更快?

linq - 使用 IQueryable 和 LINQ 查询有什么好处?

c# - 是否有 Visual Studio Load Test 开源等效项 - 或者类似的东西?

c# - 在 html anchor 中的属性后面插入 asp.net 代码

c# - 如何使用存储库模式将 EF 对象转换为 WCF 模型

C# - 未找到数据源名称且未指定默认驱动程序异常错误

c# - 表为空时序列不包含匹配元素错误