使用Linq从XML中读取并将其添加到包含对象的列表中

本文关键字:包含 添加 对象 列表 Linq XML 读取 使用 | 更新日期: 2023-09-27 18:06:03

我正试图从XML文件中读取并将每个联系人添加到联系人列表中,我得到的错误是无法将列表转换为列表

为contacts (Works)中的每个联系人写入xml文件

var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    var xEle = new XElement("Contact",
        from contact in contacts
        select new XElement("Contact",
            new XAttribute("Name", contact.Name),
                new XElement("Address", contact.StreetAddress),
                new XElement("AreaCode", contact.AreaCode),
                new XElement("City", contact.City),
                new XElement("Phone", contact.Phone),
                new XElement("Email", contact.Email)
                ));
        xEle.Save(path + "''contacts.xml");

从xml中读取并将其添加到列表中(不工作!)

XDocument xmlDoc = XDocument.Load(path + "''contacts.xml");
contacts = (List<Contact>)xmlDoc.Descendants("Contact");
XML文件输出
<Contacts>
    <Contact Name="Nils Nilsson">
        <Address>MyStreet 17B</Address>
        <AreaCode>55555</AreaCode>
        <City>BigCity</City>
        <Phone>0705555555</Phone>
        <Email>mail@gmail.com</Email>
    </Contact>
</Contact>
Contact类

 public class Contact
    {
        public string Name { get; set; }
        public string StreetAddress { get; set; }
        public string AreaCode { get; set; }
        public string City { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
    }

我现有的列表

List<Contact> contacts = new List<Contact>();

使用Linq从XML中读取并将其添加到包含对象的列表中

正如所指出的,您的原始代码不起作用的原因是LINQ对XML的所有查询都返回某种形式的XObject -最常见的是XAttributeXElement。它不会将任何东西映射到Contact

将XML映射到对象的最简单方法是利用内置的XML序列化支持。你的类需要一些属性&映射到XML结构的额外类:

[XmlRoot("Contacts")]
public class Contacts : List<Contact>
{
}
public class Contact
{
    [XmlAttribute]
    public string Name { get; set; }
    [XmlElement("Address")]
    public string StreetAddress { get; set; }
    public string AreaCode { get; set; }
    public string City { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

然后按如下方式读取XML:

using (var reader = XmlReader.Create(Path.Combine(path, "contacts.xml"))
{
    var serializer = new XmlSerializer(typeof(Contacts));
    var contacts = (Contacts)serializer.Deserialize(reader);
}
注意,您也可以使用Serialize方法在第一个实例中创建XML。

您可以尝试这样做:

var xmlDoc = XDocument.Load(path + "''contacts.xml");
var xElements = xmlDoc.Descendants("Contact");
var xmlSerializer = new XmlSerializer(typeof(Contact));
contacts = xElements.Select(xe => (Contact)xmlSerializer.Deserialize(xe.CreateReader())).ToList();