使用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的所有查询都返回某种形式的XObject
-最常见的是XAttribute
或XElement
。它不会将任何东西映射到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();