2013-05-10 141 views
0

我似乎無法指出並閱讀正確的信息。我是使用Linq的新手,並嘗試過(在將文檔作爲XDocument和XElement加載後)select,root.xelement,後代,元素,節點等,並沒有找到指向我想要的方法的正確方法目標。 我有一個現在看起來像這樣的XML文檔。C#XML Linq指向/讀取節點

<Contacts> 
    <EntryName> 
    <Name>NAME1</Name> 
    <Email>EMAIL</Email> 
    <EIL>1</EIL> 
    <Notes>Notes</Notes> 
    </EntryName> 
</Contacts> 

我需要拉出所有EntryNames的列表,並將它們放在listBox1中。 當用戶選擇一個,它收集它需要「listBox1.SelectedItem」和 聚集的相關電子郵件地址,並將其放置在文本框中。 運行時的「EntryName」被文本字段替換。 我最近的嘗試是這樣的:

var xml = XDocument.Load(apppath + @"\Contacts.clf"); 
    var entries = xml.Element("Contacts").Value.ToString(); 

     foreach (var entry in entries) 
     { 
      listBox1.Items.Add(entry.ToString()); 
     } 

它得到我只是個字符的完整文件的時間,由於 的foreach功能。我正在尋找的是在從聯繫人列表框中:

EntryName 
EntryName2 
EntryName2...etc 

和選擇時(比如從EntryName2)它拉在文本框中的電子郵件字段,並把它。請原諒和明顯或愚蠢的錯誤,這是非常新的。謝謝。

回答

0

我寫了一篇關於如何實現這一目標

public partial class Form1 : Form 
{ 
    XDocument doc; 
    public Form1() 
    { 
     InitializeComponent(); 

     doc = XDocument.Load(apppath + @"\Contacts.clf"); 
     var entryNames = doc.Root.Elements("EntryName") 
      .Select(elem => elem.Element("Name").Value).ToArray(); 
     listBox1.Items.AddRange(entryNames); 
    } 

    private void listBox1_SelectedValueChanged(object sender, EventArgs e) 
    { 
     textBox1.Text = doc.Root.Elements("EntryName") 
      .FirstOrDefault(node => node.Element("Name").Value == listBox1.SelectedItem.ToString()) 
      .Element("Email").Value; 

    } 
} 

但是這似乎是太麻煩了,找到電子郵件一個簡單的例子。我想,而不是處理這樣的:

public partial class Form1 : Form 
{ 
    XDocument doc; 
    public Form1() 
    { 
     InitializeComponent(); 
     String apppath = "."; 
     doc = XDocument.Load(apppath + @"\Contacts.clf"); 
     var contacts = doc.Root.Elements("EntryName") 
      .Select(elem => 
       new Contact { 
        Name = elem.Element("Name").Value, 
        Email = elem.Element("Email").Value, 
        EIL = elem.Element("EIL").Value, 
        Notes = elem.Element("Notes").Value 
      } 
     ).ToList(); 
     listBox1.DataSource = contacts; 
     listBox1.DisplayMember = "Name"; 
    } 

    private void listBox1_SelectedValueChanged(object sender, EventArgs e) 
    { 
     textBox1.Text = (listBox1.SelectedItem as Contact).Email; 
    }   
} 

public class Contact 
{ 
    public String Name { get; set; } 
    public String Email { get; set; } 
    public String EIL { get; set; } 
    public String Notes { get; set; } 
} 
+0

謝謝你這麼多,選擇從列表不是在我的頭上是很清楚但我已經習慣了這種再處理內部事情陣列等。由於正是我所需要的。 – Sirius 2013-05-10 13:13:29

0

試試這個。我相信你試圖查詢XML文檔中的Name元素。

var xml = XDocument.Load(apppath + @"\Contacts.clf"); 
var entries = from entryName in xml.Descendants("EntryName") select (string)entryName.Element("Name"); 

foreach (var entry in entries) 
{ 
    listBox1.Items.Add(entry); 
}