簡體   English   中英

使用Linq從XML讀取並將其添加到包含對象的列表中

[英]Read from XML Using Linq and add it to a list containing objects

我正在嘗試從XML文件讀取並將每個聯系人添加到聯系人列表,但我得到的錯誤是無法將列表轉換為列表

為聯系人中的每個聯系人編寫一個xml文件(Works)

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

正如指出的那樣,你的原始代碼不起作用的原因是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。

您可以嘗試如下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM