Поиск элеметов XML и их вывод

362
08 февраля 2017, 22:27

Есть XML, который имеет простую структуру:

<Employee>  
  <people>    
   <Name>Василий</Name>   
   <LastName>Петрович</LastName> 
  </people>
</Employee>

И так далее с десяток записей.

Есть форма WPF на которую помещён ListBox. В ListBox при загрузке формы помещаются имена сотрудников, взятые из <Name>. Как можно реализовать задачу, что если в ListBox нажимают на имя, то, скажем в соседний Label будет выводится его фамилия?

//Загрузка элементов Name и помещение их в ListBox
XElement xElements = XElement.Load(@"Employee.xml");
            foreach (XElement xEle in xElements.Descendants("Name"))
            {
                Listbox_Employee.Items.Add((string)xEle);
            }

Да данный момент, у меня эта задача работает ровно на половину. То есть, если я запушу программу, добавлю новых пользователей, а потом в ListBox выберу новое имя, то его фамилия будет показана. Но, она будет показана ровно до перезапуска программы, потому что значения хранятся в оперативке во время выполнения. Соответственно, если после запуска программы, я добавлю новые имена, то после клика на них фамилии будут показаны, но если я кликну на имена, которые были добавлены в прошлый раз, то ничего происходить не будет.

Я понимаю, что теоретически, после щелчка на объект ListBox, должен выполнится метод, который откроет XML, выполнит метод Container.Descendants и соотнесёт, что именно к этому объекту ListBox относится именно эта фамилия.
Спасибо за помощь, Любитель.
Кстати, я работаю с помощью XElement.

Дополнение 1:
Решая задачу по рекомендации Bulson, я наткрулся на другую проблему. Я создал ещё более простую по структуре XML'ку:

<MainData>
    <Name>Василий</Name>
    <LastName>Петрович</LastName>
</MainData>

Создал простую форму WPF с TextBox и ListBox. Далее по рекомендациям создал отдельный класс:

[Serializable, XmlRoot("MainData")]
   public class DataExctract
    {
        [XmlAttribute("LastName")]
        public string LastName { get; set; }
    }

Далее, на форме:

public MainWindow()
        {
            InitializeComponent();
            LoadXml(); //Выполняем метод при загрузке окна
        }
//Этот метод загружает XML и помещает дочерний элемент Name в ListBox
            public void LoadXml()
        {
            try
            {
                XElement xElements = XElement.Load(@"DataXML.xml");
                foreach (XElement xEle in xElements.Descendants("Name"))
                {
                    listBox.Items.Add((string)xEle);
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
//При двойном щелчке по любому элементу помещаем фамилию в TextBox
        private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                StreamReader reader = new StreamReader(@"DataXML.xml");
                XmlSerializer serializer = new XmlSerializer(typeof(List<DataExctract>));
                DataExctract DE = (DataExctract)serializer.Deserialize(reader);
                textBox.Text = DE.LastName;
                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

В итоге получаю исключение:

There is an error in XML document (1, 2)

Такая ошибка появляется тогда, когда я дважды щёлкаю мышкой по имени. Я нашёл 2 подобных вопроса в англоязычном Stack, но не могу понять корень зла (не хватает знаний английского).

Answer 1
  1. Вам надо создать класс Person со свойствами для ФИО.
  2. Создать класс Repository с методами для записи/чтения xml файла.
  3. При старте читать xml файл в List<Person> People и присвоить его в качестве ListBox.ItemsSource.
  4. Создать свойство public Person SelectedPerson { get; set; } и сделать привязку этого свойства к ListBox.SelectedItem, тогда при выборе в списке у вас будет изменятся это свойство и из него можно будет извлечь фамилию и показать на Label. Это описание в общих чертах, еще много разных ньюансов.
READ ALSO
Расшифровка пиктограмм в Visual Studio 2015

Расшифровка пиктограмм в Visual Studio 2015

Не могу найти никакой документации по вопросу, о том, что означают различные значки и пиктограммы в VS2015Пользуясь отладчиком столкнулся с непонятными...

435
Преобразовать byte[] в объект

Преобразовать byte[] в объект

На входе есть строка, которую необходимо преобразовать в объектДелаю так

516
WPF и MessageBox в отдельном потоке

WPF и MessageBox в отдельном потоке

Имеется приложение WPF, служит для дозирования жидкостейПри каждом новом дозировании необходимо проверить, сменилась ли емкость под дозатором,...

389