Получить дочерний элемент в другом дочернем элементе XML - PullRequest
2 голосов
/ 25 сентября 2011

У меня есть XML-файл, который выглядит следующим образом ... (XML-файл был взят из веб-служб [WCF] после передачи в него некоторого значения.)

<Title>
  <Questions>
    <QuestionID> 1 </QuestionID>
    <QuestionType> Quiz </QuestionType>
    <Question> What is the shape? </Question>
    <SubQuestionSequence> Part 1 </SubQuestionSequence>
    <SubQuestions>
           <Keywords> Ring </Keywords>
           <ParentQuestionID> 1 </ParentQuestionID>
    </SubQuestions>
    <SubQuestionSequence> Part2 </SubQuestionSequence>
    <SubQuestions>
           <Keywords> Round </Keywords>
           <ParentQuestionID> 1 </ParentQuestionID>             
    </SubQuestions>
  </Questions>
</Title>

Методы для получения дочерних элементов, как показано ниже (написано на C #), закомментированная область должна вызывать класс subQuestion, но я не уверен, как написать эту часть:

public class Questions {

    public int QuestionID { get; set; }
    public string QuestionType { get; set; }
    public string Question { get; set; }
    public string SubQuestionSequence { get; set; }            
    //suppose to call subQuestion here 
}

public class SubQuestion {

    public string Keywords { get ; set ; }
    public int ParentQuestionID { get; set; }

}

Фактический код файла, а также область запроса, я не знаю, как позвонить, если у них есть другой подраздел:

void client_GetQuestionCompleted(object sender, GetQuestionCompletedEventArgs e)
{
     if (e.Error != null)
         return;

     string result = e.Result.Nodes[0].ToString();
     XDocument doc = XDocument.Parse(result);

     var QuestionDetails = from Query in doc.Descendants("QuestionDetail")
                           select new Questions
                           {
                                QuestionID = (int)Query.Element("QuestionID"),
                                QuestionType = (string)Query.Element("QuestionType"),
                                Question = (string)Query.Element("Question"),
                                SubQuestionSequence = (string)Query.Element("SubQuestionSequence")
                           };

     int z = 0;
     foreach (var QuestionDetail in QuestionDetails)
     {
           qID = QuestionDetail.QuestionID;
           qType = QuestionDetail.QuestionType;
           quest = QuestionDetail.Question;
           subQS = QuestionDetail.SubQuestionSequence;

           z++;

     }
}

Как видно сверху, как я могу взять дочерние элементы SubQuestions (Ключевые слова и ParentQuestionID), где само SubQuestion уже является дочерним элементом?

[править] Как я могу получить повторяющийся элемент в дочернем элементе? Я хочу, чтобы какая-то часть зацикливалась и извлекала данные, а некоторые не нужно зацикливать для извлечения.

   int z = 0;
   foreach (var QuestionDetail in QuestionDetails)
   {
        qID = QuestionDetail.QuestionID;
        qType = QuestionDetail.QuestionType;
        quest = QuestionDetail.Question;
        subQS[z] = QuestionDetail.SubQuestionSequence;
        //doing it this way, i can only retrieve one row of record only, 
        //even though i used an array to save.
        subKeyword[z] = QuestionDetail.SubQuestion.Keywords;            

        z++;

   }

1 Ответ

1 голос
/ 25 сентября 2011

Пока есть только один элемент SubQuestions, вы можете просто получить доступ к Query.Element("SubQuestions").Element("Keywords") соответственно Query.Element("SubQuestions").Element("ParentQuestionID").

[править] Что касается вашего класса с объектом типа SubQuestion, вы просто используете

public class Questions {

    public int QuestionID { get; set; }
    public string QuestionType { get; set; }
    public string Question { get; set; }
    public string SubQuestionSequence { get; set; }            
    public SubQuestion SubQuestion{ get; set; }
}

public class SubQuestion {

    public string Keywords { get ; set ; }
    public int ParentQuestionID { get; set; }

}

и тогда в своем запросе вы можете использовать, например,

 var QuestionDetails = from Query in doc.Descendants("QuestionDetail")
                       select new Questions
                       {
                            QuestionID = (int)Query.Element("QuestionID"),
                            QuestionType = (string)Query.Element("QuestionType"),
                            Question = (string)Query.Element("Question"),
                            SubQuestionSequence = (string)Query.Element("SubQuestionSequence"),
                            SubQuestion = new SubQuestion() {
                               Keywords = (string)Query.Element("SubQuestions").Element("Keywords"),
                               ParentQuestionID = (int)Query.Element("SubQuestions").Element("ParentQuestionID")
                            }
                       };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...