Вывод атрибутов XML в три ListBox-a

66
07 марта 2022, 14:50

Есть некоторый XML документ

<?xml version="1.0" encoding="utf-8"?>
<specifications>
<s name="100">
<sg>014</sg>
  <time>10</time>
<sg>016</sg>
  <time>11</time>
</s>
<s name="200">
<sg>015</sg>
  <time>12</time>
<sg>017</sg>
  <time>13</time>
</s>
</specifications>

Мне необходимо вывести 3 значения из этого файла в 3 ListBox-a

Пример вывода: ListBox1 = name, ListBox2 = sg, ListBox3 = time.

Я смог вывести документ только по имени в первый ListBox

XmlDocument xDoc = new XmlDocument();
        xDoc.Load("Specification.xml");
        XmlElement xRoot = xDoc.DocumentElement;
        foreach (XmlElement xnode in xRoot)
        {
            XmlNode attr = xnode.Attributes.GetNamedItem("name");
            listBox1.Items.Add(attr.Value);
        }

Я прошелся по учебникам и нашел данное решение:

    public List<string> ListTest1 { get; } = new List<string>();
    public List<string> ListTest2 { get; } = new List<string>();
    private void reff()
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("Specification.xml");
        XmlElement xRoot = xDoc.DocumentElement;
        foreach (XmlElement xnode in xRoot)
        {
            XmlNode attr = xnode.Attributes.GetNamedItem("name");
            listBox1.Items.Add(attr.Value);

            foreach (XmlNode childnode in xnode.ChildNodes)
            {
                switch (attr.Value)
                {
                    case "100":
                        ListTest1.Add(childnode.InnerText);
                        break;
                    case "200":
                        ListTest2.Add(childnode.InnerText);
                        break;
                }
            }
        }
    }
 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListBox comboBox = (ListBox)sender;
        string selectedValue = (string)listBox1.SelectedItem;
        switch (selectedValue)
        {
            case "100":
                listBox2.DataSource = ListTest1;
                listBox3.DataSource = ListTest1;
                break;
            case "200":
               listBox2.DataSource = ListTest2;
               listBox3.DataSource = ListTest2;
                break;
        }
    }

Но оно выводит только два параметра и как вывести третье я не нашел(третье выводит вместе со вторым). И к тому же, файл XML в последствии планируется пополняться (ПРИМЕР: s name="300" и так далее). А в этом примере используется Константа в "case" и этот вариант совсем не подходит.

Вот как должно выглядеть(кроме цифры 11, что должна быть в ListBox3): 1) Начальный запуск - 2) Выбор первой спецификации - 3) Выбор 2 спецификации

Time везде одинаковый только на картинках, так как они были сделаны до правильного написания.

Подскажите пожалуйста как решить данный вопрос. Заранее спасибо

Answer 1

Для сбора данных создадим такой класс

public class Spec
{
    public List<string> Ss { get; } = new List<string>();
    public List<string> Sgs { get; } = new List<string>();
    public List<string> Times { get; } = new List<string>();
}

Для парсинга xml создадим такой класс

public class XmlService
{
    public static Spec GetSpec(string pathToFileXml)
    {
        if (string.IsNullOrEmpty(pathToFileXml))
            throw new ArgumentException("Требуется путь к файлу!", nameof(pathToFileXml));
        if (!File.Exists(pathToFileXml))
            throw new ArgumentException("Такой файл не существует!", nameof(pathToFileXml));
        var result = new Spec();
        XDocument doc = XDocument.Load(pathToFileXml);
        foreach (XElement item in doc.Descendants("specifications").Elements("s"))
        {
            var val = item.Attribute("name").Value;
            result.Ss.Add(val);
        }
        foreach (XElement item in doc.Descendants("specifications").Elements("s").Elements("sg"))
        {
            var val = item.Value;
            result.Sgs.Add(val);
        }
        foreach (XElement item in doc.Descendants("specifications").Elements("s").Elements("time"))
        {
            var val = item.Value;
            result.Times.Add(val);
        }
        return result;
    }
}

Код формы такой

public partial class FormMain : Form
{
    public FormMain()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Load += FormMain_Load;
    }
    private void FormMain_Load(object sender, EventArgs e)
    {
        var spec = XmlService.GetSpec("specs.xml");
        _listBoxSgs.DataSource = spec.Sgs;
        _listBoxSs.DataSource = spec.Ss;
        _listBoxTimes.DataSource = spec.Times;
    }
}
READ ALSO
Двухсторонняя сортировка выбором Double selection sort

Двухсторонняя сортировка выбором Double selection sort

У кого либо может быть есть работающий код на C# (простыми конструкциями сделанный) с двухсторонней сортировкой выбором (Double selection sort)? Можете...

73
Ошибки при размещении сайта asp.net framework на iis

Ошибки при размещении сайта asp.net framework на iis

Я создал простой сайт на aspnet framework, в котором есть стандартная проверка подлинности пользователей, то есть регистрация, но я добавил в нее...

130
C# очищение поверхности Win Forms

C# очищение поверхности Win Forms

В главной форме проинициализирована переменная отвечающая за графику g = thisCreateGraphics()

77