user3751248
user3751248

Reputation: 323

reading and retrieving xml elements

I need to read all the nested elements in my xml file. Below is the program. In the program below I am able to get the values for Question and Answer but not for SubQuestionAnswer/Question and SubQuestionAnswer/Answer. Could someone tell me what is wrong in my program

XmlDocument xmlDocument = new XmlDocument();

            var fataQuestionnaire = @"<?xml version=""1.0"" encoding=""UTF-16""?>
                <FatcaQuestionnaire xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
                  <QuestionAnswers>
                    <QuestionAnswer>
                      <Question>What is your source of wealth?</Question>
                      <Answer>I am italian </Answer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>What is your occupation and name of employer?</Question>
                      <Answer>Bestinvest</Answer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>Do you have a business or residence in?</Question>
                      <Answer>Yes</Answer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>How long have you lived outside of Albania</Question>
                      <Answer>5 years</Answer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>Do you return to Albania on a regular basis</Question>
                      <Answer>Yes</Answer>
                      <SubQuestionAnswer>
                        <Question>How frequently?</Question>
                        <Answer>every year</Answer>
                      </SubQuestionAnswer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>Do you have family in Albania?</Question>
                      <Answer>Yes</Answer>
                      <SubQuestionAnswer>
                        <Question>Family relationship?</Question>
                        <Answer>My parents lives there</Answer>
                      </SubQuestionAnswer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>Are you connected to the government of Albania?</Question>
                      <Answer>Yes</Answer>
                      <SubQuestionAnswer>
                        <Question>Nature of association</Question>
                        <Answer>I was an ex minister</Answer>
                      </SubQuestionAnswer>
                    </QuestionAnswer>
                    <QuestionAnswer>
                      <Question>Do you send or receive money from Albania?</Question>
                      <Answer>Yes</Answer>
                      <SubQuestionAnswer>
                        <Question>How often and why?</Question>
                        <Answer>Every month for my parents to live with.</Answer>
                      </SubQuestionAnswer>
                    </QuestionAnswer>
                  </QuestionAnswers>
                </FatcaQuestionnaire>";

            XmlTextReader reader = new XmlTextReader(new StringReader(fataQuestionnaire));


            xmlDocument.Load(reader);

            XmlElement xmlRoot = xmlDocument.DocumentElement;
            if (xmlRoot != null)
            {
                XmlNodeList xnlNodes = xmlRoot.SelectNodes("/FatcaQuestionnaire/QuestionAnswers/QuestionAnswer");
                string questionanswer =string.Empty;


                if (xnlNodes != null)
                    foreach (XmlNode xndNode in xnlNodes)
                    {
                        if (xndNode["Question"] != null)
                            questionanswer = (xndNode["Question"].InnerText);

                        if (xndNode["Answer"] != null)
                            questionanswer = (xndNode["Answer"].InnerText);


                        if (xndNode["SubQuestionAnswer/Question"] != null)
                            questionanswer = (xndNode["SubQuestionAnswer/Question"].InnerText);

                        if (xndNode["SubQuestionAnswer/Answer"] != null)
                            questionanswer = (xndNode["SubQuestionAnswer/Answer"].InnerText);
                    }


            }

Upvotes: 0

Views: 43

Answers (2)

Arie
Arie

Reputation: 5373

Another option: instead of XmlDocument use XDocument and Linq.

Load xml:

XDocument doc = XDocument.Parse(fataQuestionnaire);

example use:

List<KeyValuePair<string,string>> allQuestionAnswers = doc.Descendants("QuestionAnswer").Union(doc.Descendants("SubQuestionAnswer"))
    .Select(qa=>new KeyValuePair<string,string>(qa.Element("Question").Value, qa.Element("Answer").Value)).ToList();

foreach (var pair in allQuestionAnswers)
{
    Console.WriteLine("Q: " + pair.Key +"\nA: " + pair.Value + "\n");
}

result:

Q: What is your occupation and name of employer?
A: Bestinvest

Q: Do you have a business or residence in?
A: Yes

Q: How long have you lived outside of Albania
A: 5 years

Q: Do you return to Albania on a regular basis
A: Yes

Q: Do you have family in Albania?
A: Yes

Q: Are you connected to the government of Albania?
A: Yes

Q: Do you send or receive money from Albania?
A: Yes

Q: How frequently?
A: every year

Q: Family relationship?
A: My parents lives there

Q: Nature of association
A: I was an ex minister

Q: How often and why?
A: Every month for my parents to live with.

or:

doc.Descendants("QuestionAnswer").ToList().ForEach(qa =>
{
    Console.WriteLine("Q: " + qa.Element("Question").Value + "\nA: " + qa.Element("Answer").Value);
    var sqa = qa.Element("SubQuestionAnswer");
    if (sqa != null)
    {
        Console.WriteLine("\tQ: " + sqa.Element("Question").Value + "\n\tA: " + sqa.Element("Answer").Value);
    }
    Console.WriteLine();
 });

result:

Q: What is your source of wealth?
A: I am italian 

Q: What is your occupation and name of employer?
A: Bestinvest

Q: Do you have a business or residence in?
A: Yes

Q: How long have you lived outside of Albania
A: 5 years

Q: Do you return to Albania on a regular basis
A: Yes
    Q: How frequently?
    A: every year

Q: Do you have family in Albania?
A: Yes
    Q: Family relationship?
    A: My parents lives there

Q: Are you connected to the government of Albania?
A: Yes
    Q: Nature of association
    A: I was an ex minister

Q: Do you send or receive money from Albania?
A: Yes
    Q: How often and why?
    A: Every month for my parents to live with.

Upvotes: 1

Fratyx
Fratyx

Reputation: 5797

XPath-syntax is not supported by the indexers. You can fix it this way:

if (xndNode["SubQuestionAnswer"] != null)
{
    if (xndNode["SubQuestionAnswer"]["Question"] != null)
        questionanswer = (xndNode["SubQuestionAnswer"]["Question"].InnerText);

    if (xndNode["SubQuestionAnswer"]["Answer"] != null)
        questionanswer = (xndNode["SubQuestionAnswer"]["Answer"].InnerText);
}

Upvotes: 1

Related Questions