【发布时间】:2018-04-17 16:05:32
【问题描述】:
在 C# System.Xml.Serialization 中有一个 XML 数据序列化。
有一个描述根元素的根类。它包含在后代类(如电影)中描述的 List 类型的文件。
我可以将我的 XML 文档反序列化为一个类,并简单地使用 List.Add 或 List.Insert 在列表中添加一个新元素:
cfg.Movies.Insert(0, new Movie("Newly added: Pulp Fiction", "1994"));
但是反向操作不起作用:
cfg.Movies.Remove(new Movie("To be removed: The Godfather", "1974"));
所以问题是如何从 xml 类列表中删除一个元素?
样本在这里:https://dotnetfiddle.net/WqCNoD
using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Xml.Serialization;
public class Program
{
public static void Main()
{
string xmlString =
@"<favorites>
<movies>
<movie title=""To be removed: The Godfather"" year=""1974"" />
<movie title=""The Terminator"" year=""1984"" />
<movie title=""Dark Knight"" year=""2008"" />
</movies>
<books>
<book title = ""1984"" author=""George Orwell"" />
<book title = ""Robinson Crusoe"" author=""Daniel Defoe "" />
<book title = ""Frankenstein"" author=""Mary Shelly"" />
</books>
<music>
<artist title = ""Beatles"" genre=""rock"" />
<artist title = ""Queen"" genre=""rock"" />
<artist title = ""Metallica"" rock=""heavy metal"" />
</music>
</favorites>";
XDocument xdoc = XDocument.Parse(xmlString);
var xdocData = xdoc.ToString();
//DeSerialization
XmlSerializer serializer = new XmlSerializer(typeof(Favorites));
using (StringReader reader = new StringReader(xdoc.ToString()))
{
Favorites cfg = (Favorites) serializer.Deserialize(reader);
// Add & remove element
cfg.Movies.Insert(0, new Movie("Newly added: Pulp Fiction", "1994"));
cfg.Movies.Remove(new Movie("To be removed: The Godfather", "1974"));
//Serialization
XmlSerializer serializer2 = new XmlSerializer(cfg.GetType());
using (StringWriter writer = new StringWriter())
{
serializer2.Serialize(writer, cfg);
Console.WriteLine(writer.ToString());
}
}
}
[XmlRoot(ElementName = "favorites", DataType = "string", IsNullable = true)]
public class Favorites
{
//public string Name { get; set; }
[XmlArray("movies")]
[XmlArrayItem("movie")]
public List<Movie> Movies { get; set; }
public Favorites()
{
Movies = new List<Movie>();
}
}
public class Movie
{
[XmlAttribute("title")]
public string Title { get; set; }
[XmlAttribute("year")]
public string Year { get; set; }
public Movie() { }
public Movie(string title, string year)
{
Title = title;
Year = year;
}
}
}
【问题讨论】:
-
当你创建一个新对象时,它的引用还没有在列表中。您需要在列表中搜索要删除的项目,然后使用搜索结果将其删除。比如:
var toRemove = cfg.Movies.Single(m => m.Title == "To be removed: The Godfather" && m.Year == "1974"); cfg.Movies.Remove(toRemove); -
它不是一个“xml 类”。它只是一个恰好有序列化属性的常规类。
-
这个请求和昨天的请求有什么区别? :stackoverflow.com/questions/49867071/…
-
@jdweng,这是完全不同的问题,它们只有相似的 xml 数据。第一个与过滤 xml 节点有关,而这一个专门与 XmlArray 和 List 的操作有关。谢谢。