2013-05-10 2 views
0

Я не могу указать и прочитать правильную информацию. Я новичок в использовании Linq и попробовал (после загрузки документа как XDocument и XElement), выберите 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()); 
     } 

Который получает меня ничего, кроме символов в момент полного файла благодаря функции Еогеасп. То, что я ищу это в ListBox из списка контактов:

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; 

    } 
} 

Однако это кажется слишком много хлопот, чтобы найти e-mail. Я бы, вместо того, чтобы справиться с этим, как это:

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

0

Попробуйте это. Я считаю, что вы пытались запросить элементы Name в своем XML-документе.

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); 
} 
Смежные вопросы