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

时间:2016-09-06 10:02:34

标签: c# xml linq list

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

为联系人(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>

联系班级

 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>();

2 个答案:

答案 0 :(得分:2)

正如所指出的,原始代码不起作用的原因是LINQ to 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。

答案 1 :(得分:1)

您可以尝试这样的事情:

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();