2013-05-10 101 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); 
}