Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq读取XML并将其添加到包含对象的列表中_C#_Xml_Linq_List - Fatal编程技术网

C# 使用Linq读取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

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

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

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

我现有的名单

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