Страницы

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

воскресенье, 16 июня 2019 г.

Можно ли каким-то образом оптимизировать вот такой парсинг XML?

Два класса для запоминания разобранного:
class Answer { public int Index { get; set; } public bool Correct { get; set; } public string Desc { get; set; } }
class Question { public int Id { get; set; } public string Content { get; set; } public string MainQuestion { get; set; } public int MainQuestionContent { get; set; } public List Answers { get; set; } = new List(); }
Далее сам XML и его парсинг:
static void Main(string[] args) { string xml = @" Вопрос 1 Ответ 1 Ответ 2 Ответ 3 ";
XElement elements = XElement.Parse(xml);
List questionsList = new List(); Question itemQuestion; Answer itemAnswer;
foreach (XElement question in elements.Element("questions").Elements("question")) { itemQuestion = new Question();
itemQuestion.Id = Convert.ToInt32(question.Attribute("id")?.Value); itemQuestion.Content = question.Attribute("content")?.Value; itemQuestion.MainQuestion = question.Element("main_question")?.Value; itemQuestion.MainQuestionContent = Convert.ToInt32(question.Element("main_question")?.Attribute("content")?.Value);
var answers = from a in question.Elements("answer") select new { AttributeIndex = a.Attribute("index")?.Value, AttributeCorrect = a.Attribute("correct")?.Value, Answer = a?.Value };
if (answers.Any()) { foreach (var item in answers) { itemAnswer = new Answer();
itemAnswer.Index = Convert.ToInt32(item.AttributeIndex); itemAnswer.Correct = Convert.ToBoolean(item.AttributeCorrect); itemAnswer.Desc = item.Answer;
itemQuestion.Answers.Add(itemAnswer); } }
questionsList.Add(itemQuestion);
} }
Хотелось бы foreach (XElement question in elements.Element("questions").Elements("question")) превратить в запрос LINQ, только я не могу сообразить как.
Благодаря подсказке @Grundy получилось оптимизировать так:
List questionsList = (from question in elements.Element("questions").Elements("question") select new Question() { Id = Convert.ToInt32(question.Attribute("id")?.Value), Content = question.Attribute("content")?.Value, MainQuestion = question.Element("main_question")?.Value, MainQuestionContent = Convert.ToInt32(question.Element("main_question")?.Attribute("content")?.Value), Answers = (from a in question.Elements("answer") select new Answer { Index = Convert.ToInt32(a.Attribute("index")?.Value), Correct = Convert.ToBoolean(a.Attribute("correct")?.Value), Desc = a?.Value
}).ToList() }).ToList();


Ответ

По сути, код эквивалентен обычному select
Например такому:
List questionsList = (from question in elements.Element("questions").Elements("question") select new Question(){ Id = Convert.ToInt32(question.Attribute("id")?.Value), ... Answers = (from a in question.Elements("answer") select new Answer { Index = Convert.ToInt32(a.Attribute("index")?.Value), ... }).ToList() }).ToList();

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

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