Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Реализация дерева вопросов

Я хочу в приложении сделать что то наподобие окошка, с тремя кнопками Где в окно выводится вопрос, а методом нажатия кнопок "да", "нет", или "назад"(если неверно ответил) ты приходишь к конкретному ответу, и выполняются какие то действия. Как можно реализовать подобное? - Был вариант использовать класс с ссылкой на родительский объект, и два дочерних (как бы варианты ответа) Но здесь возникла проблема в инициализации самой иерархии, как задавать дочерние компоненты если их еще нет, и как вообще построить дерево не используя куча сеттеров и вручную создаваемых объектов с инициализацией каждого поля. - Был вариант использовать xml но здесь куча сложностей с обходом вложенных тегов. Только проблемы и головная боль. Туторов и мануалов нигде нет подходящих, в доках ничего полезного не нашел ну или не заметил. (хотя действительно пытался) - Есть вариант написать дерево на html и просто парсить по типу: взять дочерние элементы, вытянуть вопрос, если нажата кнопка "да" взять первый дочерний элемент, если "нет" то второй. Если назад то вернуть родительский элемент. Но подключать для этого jsoup да и вообще парсинг как то слишком для этого. Подскажите как можно реализовать такую штуку, если не другим способом, то хотя бы адекватно одним из вышеописанных. Уже второй день стоит эта проблема.


Ответ

Код написан на C#. Значит так, сначала структура файла:

Теперь код парсера (выглядит все просто, но если есть какие-то вопросы по коду с удовольствием отвечу. Так же можно все написать по другому, но это то что я собрал на коленке ):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml;
namespace xmlTester { class Question { public string Text { get; set;} public List Answers; public int CorrectAnswerIndex { get; set; } public Question() { Text = ""; Answers = new List(); CorrectAnswerIndex = -1; }
public override string ToString() { string str = "";
if(Text != "" && Answers.Count > 0 && CorrectAnswerIndex != -1) //if everything is ok { str += "Question: " + Text + "
"; str += "Possible answers:
"; foreach(string answer in Answers) { str += "- " + answer + "
"; } str += "The correct answer is: " + Answers[CorrectAnswerIndex] + "
"; }
return str; } }
class Program { static XmlDocument xmlDoc = new XmlDocument(); static List questionsList = new List();
static void LoadQuestions() { try { xmlDoc.Load(@"D:\Users\desk\Documents\test.xml"); XmlNode questions = xmlDoc.DocumentElement.SelectSingleNode("/questions"); //root node name, should be with slash '/'! if (questions.HasChildNodes) { foreach (XmlNode question in questions.ChildNodes) { Question q = new Question(); string text = question.Attributes["text"]?.InnerText; q.Text = (text == null) ? "" : text; //if text is null, return empty string
if (question.HasChildNodes) //we must be sure, that it's valid question structure { XmlNode answers = question.FirstChild; if(answers.HasChildNodes) //answers should have a child nodes { foreach(XmlNode answer in answers.ChildNodes) { string answerText = answer.Attributes["text"]?.InnerText; string isCorrect = answer.Attributes["correct"]?.InnerText;
q.Answers.Add((answerText == null) ? "" : answerText); //if anserText is null, return ampty string if(isCorrect != null && isCorrect == "true") { q.CorrectAnswerIndex = q.Answers.Count - 1; //index is quantity of the answers minus 1. } } //end of foreach(XmlNode answer in answers.ChildNodes) } //end of if(answers.HasChildNodes) } //end of if (question.HasChildNodes)
questionsList.Add(q); } //end of foreach (XmlNode question in questions.ChildNodes) } //end of if (questions.HasChildNodes) } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } }
static void Main(string[] args) { LoadQuestions();
foreach (Question q in questionsList) //if questionsList is empty, the program is not enters to the loop at all { Console.WriteLine("-------------------"); Console.Write(q.ToString()); Console.WriteLine("-------------------
"); }
Console.ReadLine(); } } }
Надеюсь мой ответ вам помежет разобраться :)

Комментариев нет:

Отправить комментарий