Считывание выбранного элемента из XML (XDocument)

190
09 мая 2018, 01:45

Какая команда в XDocument аналогична строке из xmlDocument: pictureBoxItem1.ImageLocation = xmlDoc.DocumentElement.ChildNodes[comboBox1.SelectedIndex].ChildNodes[3].InnerText;

Картина в общем: в combobox загружается поле Имя каждого элемента.С каждым выбором элемента в combox`e в элементы picturebox, textbox подставляются соответствующие строки выбранного элемента.И, не по теме, возможно ли сделать присвоение атрибута "id" автоматически? Пример кода XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Champions>
 <Champion id="26">
  <NameC>NameHere</NameC>
  <ImageC>ImageLocation</ImageC>
  <BuildC>BuildHere</BuildC>
  <item1>ImageHere</item1>
   ....
  </Champion>
</Champions>

Вот код заполнения combobox

void FillComboBox()
        {
            comboBox1.Items.Clear();
            var chmp = from Champion in
                           XDocument.Load(Path.Combine(Environment.CurrentDirectory, "champions.xml")).Descendants("Champion")
                       select new Champion
                       {
                           NameC = Champion.Element("NameC").Value.ToString()
                       };
            foreach (var Champion in chmp)
            {
                comboBox1.Items.Add(Champion.NameC);
            }
Answer 1

Идеальный вариант - создать нормальный модельный класс(ы), десериализовать XML в объекты и работать уже с объектами. Но если хочется извращений с голым XML, можно и так =)

XDocument и сопутствующие классы, в отличие от XmlDocument, возвращают IEnumerable<T> для коллекций вложенных элементов, LiNQ все таки. Поэтому прямого обращения по индексу там не предусмотрено. Можно выкрутиться путём материализации IEnumerable<T> в List<T>, но учтите, что в общем случае нет гарантии постоянного соответствия индексов и элементов.

Теперь о том как такого "монстра" сделать. Простой пример поиска элемента по id на примере вашего XML:

var doc = XDocument.Parse("<Champions>"+
                            "<Champion id=\"25\">"+
                              "<NameC>NameHere</NameC>"+
                              "<ImageC>ImageLocation</ImageC>"+
                              "<BuildC>BuildHere</BuildC>"+
                              "<item1>ImageHere</item1>"+
                            "</Champion>"+
                          "</Champions>");
Console.Write(doc.Root.Descendants("Champion")
    .FirstOrDefault(e => e.Attribute("id")?.Value == "26")
    ?.Element("ImageC")?.Value);

Для обращения по индексу, материализуем перечисление:

Console.Write(doc.Root.Descendants("Champion")
    .ToList()[0]//создаем List из перечисления и обращаемся по индексу
    .Element("ImageC")?.Value);

Минус последнего варианта - возможность получить исключение при обращение к несуществующему индексу, первый вариант лишен такого недостатка.

Еще раз повторю: да это можно сделать, но так делать не нужно. Лучше потратить немного времени на модельный класс(ы), настроить XML-сериализацию и работать в UI с коллекцией нормальных объектов и штатными биндингами.

READ ALSO
Создание разного количества DropDownlist в MVC

Создание разного количества DropDownlist в MVC

Грубо говоря, есть основная запись в БД (Processing), есть коллекция - к каким темам относится основная запись (EmailTheme)Для этого написаны следующие...

167
заглушка для REST сервера для юнит тестов

заглушка для REST сервера для юнит тестов

Пишу я REST клиента и хочется мне его тестами покрыть, а зависеть от внешних сервисов не хочетсяREST API сервиса, к которому подключаться я знаю,...

144
Logout Vk webbrowser

Logout Vk webbrowser

Сделал авторизацию в webbrowser, но как выйти из учетки вк? Побывал через https://loginvk

175
Переназначение локальных переменных ref

Переназначение локальных переменных ref

В новом обновлении завезли

138