C# 使用Linq读取XML并将其添加到包含对象的列表中
我试图从一个XML文件中读取并将每个联系人添加到联系人列表中。我得到的错误是无法将列表转换为列表 为contacts(Works)中的每个联系人写入xml文件 读取xml并将其添加到列表中(不起作用!) 我现有的名单C# 使用Linq读取XML并将其添加到包含对象的列表中,c#,xml,linq,list,C#,Xml,Linq,List,我试图从一个XML文件中读取并将每个联系人添加到联系人列表中。我得到的错误是无法将列表转换为列表 为contacts(Works)中的每个联系人写入xml文件 读取xml并将其添加到列表中(不起作用!) 我现有的名单 List<Contact> contacts = new List<Contact>(); List contacts=new List(); 您可以尝试以下方法: var xmlDoc = XDocument.Load(path + "\\contact
List<Contact> contacts = new List<Contact>();
List contacts=new List();
您可以尝试以下方法:
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();
您可以尝试以下方法:
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();
如前所述,原始代码不起作用的原因是LINQ to XML中的所有查询都返回某种形式的
XObject
——最常见的是XAttribute
或XElement
。它不会将任何内容映射到联系人
将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。正如所指出的,原始代码不起作用的原因是LINQ to XML中的所有查询都返回某种形式的XObject
——最常见的是XAttribute
或XElement
。它不会将任何内容映射到联系人
将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; }
}
注意:您还可以使用
Serialize
方法在第一个实例中创建XML。xmlDoc.containers(“Contact”)
返回一个IEnumerable
。您需要将那些XElement
s反序列化到Contact
对象。xmlDoc.containers(“Contact”)
返回一个IEnumerable
。你需要将那些XElement
s反序列化到你的联系人
对象。效果很好!但由于某些原因,它似乎将联系人添加到索引1而不是0上,效果非常好!但出于某种原因,它似乎将联系人添加到索引1而不是0上,这应该被标记为答案。我忽略了属性,没有意识到PropertyName中的差异,而名称是一个属性。这应该被标记为答案。我忽略了属性,没有意识到PropertyName和Name是属性的区别。
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();
[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; }
}
using (var reader = XmlReader.Create(Path.Combine(path, "contacts.xml"))
{
var serializer = new XmlSerializer(typeof(Contacts));
var contacts = (Contacts)serializer.Deserialize(reader);
}