C#XML Linq指向/读取节点

时间:2013-05-10 01:49:13

标签: c# linq-to-xml

我似乎无法指出并阅读正确的信息。我是新手使用Linq并尝试过(在将文档加载为XDocument和XElement之后)select,root.xelement,descendant,element,node等,并且没有找到指向我正在尝试的方法的正确方法目标。 我现在有一个XML文档。

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

我需要提取所有EntryNames的列表并将它们放在listBox1中。 当用户选择一个时,它会收集“listBox1.SelectedItem”和 收集关联的电子邮件地址并将其放在textBox中。 运行时期间的“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功能。我正在寻找的是来自Contacts:

的listBox
EntryName
EntryName2
EntryName2...etc

并且当选择时(来自EntryName2),它会拉出电子邮件字段并将其放在文本框中。请原谅,明显或愚蠢的错误,这是非常新的。感谢。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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; }
}