2016-09-06 13 views
0

XMLファイルを読み込み、すべての連絡先を連絡先リストに追加しようとしていますが、取得できないエラーは変換できません。リストにリストXMLからLinqを使用して読み込み、オブジェクトを含むリストに追加します。

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から読み込み、リストに追加

が連絡先の各連絡先の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>[email protected]</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>(); 
+0

'xmlDoc.Descendants(" Contact ")'は、IEnumerable を返します。それらの 'XElement'をあなたの' Contact'オブジェクトに逆シリアル化する必要があります。 –

答えて

2

をLINQ to XMLのすべてのクエリがの何らかの形式を返すことです- 最も一般的にはXAttributeまたはXElementです。 Contactには何もマッピングされません。

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構造にマップするための属性&余分なクラスのカップルを必要とします最初のインスタンスのXML

+0

これは答えとしてマークする必要があります。私はプロパティを見落とし、PropertyNameの違いを認識せず、NameはAttributeです。 –

1

あなたはこのような何か試すことができますように、あなたの元のコードは、」doesnの理由を指摘

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

素晴らしい作品です!何らかの理由で0の代わりにインデックス1に連絡先を追加するように思われる –

関連する問題