【问题标题】:Saving in XML only last object from the list仅在 XML 中保存列表中的最后一个对象
【发布时间】:2017-11-29 12:19:04
【问题描述】:

您能告诉我如何修复我的代码吗?我尝试了很多方法,例如使用 XmlSerializer,但仍然没有。 代码总是保存列表的最后一项,我不知道如何修复它。 代码:

 foreach (ObservableCollection<Person> x in list)
            {

                XDocument xdoc = new XDocument(
                     new XDeclaration("1.0", "utf-8", "yes"),
                     new XElement("Person",
                     from person in x
                     select new XElement("Person",
                         new XElement("Name", person.Name),
                         new XElement("Surname", person.Surname),
                         new XElement("Age", person.Age))));
                xdoc.Save(path);
            }

如果有任何提示,我将不胜感激!

【问题讨论】:

  • list 是什么类型? from image select 没有意义,你能确定你发布了一个编译的例子吗?
  • 我之前有自己的代码,但无法理解,所以我将其更改为更透明的示例。所以应该有“从人中选择”人的类型:ObservableCollection> list
  • xdoc.Save(path)。如果路径相同,它将继续覆盖旧文件。因此,如果 list 中的最后一个 ObservableCollection&lt;Person&gt; 只有一个元素,您将只能看到文件中的最后一项。

标签: c# xml


【解决方案1】:

从 cmets 我了解到您有一个列表列表,并且您希望在生成的 XML 中将其展平。你可以使用这个:

XDocument xdoc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"),
        new XElement("Persons",
            from x in list
            from person in x
            select new XElement("Person",
            new XElement("Name", person.Name),
            new XElement("Surname", person.Surname),
            new XElement("Age", person.Age))));

xdoc.Save("tmp.xml");

您的解决方案不起作用,因为您在 foreach 循环的每次迭代中都保存了 XML 文档,这将覆盖现有文件,因此结果将只是循环的最后一次迭代

【讨论】:

  • 是的!现在可以了,非常感谢。我知道,但我不知道如何解决它。再一次 - 谢谢!
  • @Elgahir 很乐意提供帮助,别忘了标记为已回答
【解决方案2】:

他是一个略有不同的 xml linq 解决方案:

XDocument xdoc = new XDocument(
                     new XDeclaration("1.0", "utf-8", "yes"),
                     new XElement("People"));
XElement people = xdoc.Root;
foreach (ObservableCollection<Person> x in list)
{

   XElement person =  new XElement("Person", fom person in x
      select new XElement("Person",
         new XElement("Name", person.Name),
         new XElement("Surname", person.Surname),
         new XElement("Age", person.Age)));
   people.Add(person);
}
xdoc.Save(path);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2021-12-29
    • 2016-12-31
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多