Чтение элементов XML и их Под-Элементов

108
24 февраля 2022, 05:50

Существет файл XML

<?xml version="1.0" encoding="utf-8"?>
<specifications>
<s>Test1</s>
   <sg>014</sg>
   <sg>016</sg>
   <sg>014</sg>
   <sg>014</sg>
   <sg>016</sg>
<s>Test2</s>
   <sg>015</sg>
   <sg>017</sg>
   <sg>017</sg>
   <sg>017</sg>
</specifications>

И так же существует форма, на которой поставлено два ComboBox-а.

Мне необходимо сделать так, чтобы при выборе в Комбобоксе1 (Test1), в Комбобоксе2 отображалось только то, что принадлежит Test1 - (014, 016), и соответсвенно при выборе в Комбобоксе1 (Test2), в Комбобоксе2 отображалось (015, 017). Чтобы в комбобоксе2 отображалось, все нужное и без повторений

Пытался что-то сделать таким образом

 XmlDocument xDoc = new XmlDocument();
        xDoc.Load("Specification.xml");
        XmlNodeList Listik = xDoc.SelectNodes("//s"); 
        foreach (XmlNode name in Listik)
        {
            comboBox1.Items.Add(name.InnerText);
            XmlNodeList Listik1 = xDoc.SelectNodes("//sg");
            foreach (XmlNode name1 in Listik1)
            {
                comboBox2.Items.Add(name1.InnerText);
                object[] mas = comboBox2.Items.OfType<string>().Distinct().ToArray();
                comboBox2.Items.Clear();
                comboBox2.Items.AddRange(mas);
            }

        }

Но честно говоря, до логического завершения так довести и не смог.

Что посоветуете?

И да, я знаю, что вопрос наверно 100% легкий. Отчаянно туплю...

Answer 1

начнем с того, что неправильно построен xml файл, вот правильный вариант в твоем случае:

<?xml version="1.0" encoding="utf-8"?>
<specifications>
<s name="Test1">
   <sg>014</sg>
   <sg>016</sg>
   <sg>014</sg>
   <sg>014</sg>
   <sg>016</sg>
</s>
<s name="Test2">
   <sg>015</sg>
   <sg>017</sg>
   <sg>017</sg>
   <sg>017</sg>
</s>
</specifications>

далее, ты создаешь 2 ComboBox, первому добавляешь событие SelectedIndexChanged и в зависимости от этого меняешь значение во втором

public List<string> ListTest1 { get; } = new List<string>();
public List<string> ListTest2 { get; } = new List<string>();
public Form1()
{
    InitializeComponent();
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load("Specification.xml");
    XmlElement xRoot = xDoc.DocumentElement;
    foreach (XmlElement xnode in xRoot)
    {
        XmlNode attr = xnode.Attributes.GetNamedItem("name");
        comboBox1.Items.Add(attr.Value);
        foreach (XmlNode childnode in xnode.ChildNodes)
        {
            switch (attr.Value)
            {
                case "Test1":
                        if(!ListTest1.Contains(childnode.InnerText))
                            ListTest1.Add(childnode.InnerText);
                        break;
                case "Test2":
                        if (!ListTest2.Contains(childnode.InnerText))
                            ListTest2.Add(childnode.InnerText);
                        break;
            }                        
        }
    }
}
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    string selectedValue = (string)comboBox1.SelectedItem;
    switch (selectedValue)
    {
        case "Test1":
            comboBox2.DataSource = ListTest1;
            break;
        case "Test2":
            comboBox2.DataSource = ListTest2;
            break;
    }
}
READ ALSO
Ошибка	CS7036 помогите пофиксить [закрыт]

Ошибка CS7036 помогите пофиксить [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

148
Создание модели через рефлексию для сохранений Unity C#

Создание модели через рефлексию для сохранений Unity C#

Я новичок и пишу систему сохранений в Unity, которую хотелось бы использовать и в других своих проектахВ Интернете полно способов сделать сохранения...

69
Как правильно построить две колонки на Css grid

Как правильно построить две колонки на Css grid

Не получается построить две колонки

184
PhpMyAdmin и HTML

PhpMyAdmin и HTML

Пишу сайтСоздал несколько таблиц в phpmyadmin

88