There is such an XML file

<?xml version="1.0" encoding="utf-8"?> <quiz> <question title="Question ONE"> <answer_one title="First answer">true</answer_one> <answer_two title="Second answer">false</answer_two> <answer_three title="Third answer">false</answer_three> <answer_four title="Fourth answer">false</answer_four> </question> <question title="Question TWO"> <answer_one title="First answer">false</answer_one> <answer_two title="Second answer">true</answer_two> <answer_three title="Third answer">false</answer_three> <answer_four title="Fourth answer">false</answer_four> </question> <question title="Question THREE"> <answer_one title="First answer">false</answer_one> <answer_two title="Second answer">false</answer_two> <answer_three title="Third answer">false</answer_three> <answer_four title="Fourth answer">true</answer_four> </question> <question title="Question FOUR"> <answer_one title="First answer">false</answer_one> <answer_two title="Second answer">true</answer_two> <answer_three title="Third answer">false</answer_three> <answer_four title="Fourth answer">false</answer_four> </question> <question title="Question FIVE"> <answer_one title="First answer">false</answer_one> <answer_two title="Second answer">true</answer_two> <answer_three title="Third answer">false</answer_three> <answer_four title="Fourth answer">false</answer_four> </question> </quiz> 

Task parse it using XMLPullParser and write to ArrayList (for a start). MainActivity code

 package com.example.lexzcq.eyewsefs; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { final static String TAG = "log"; private ArrayList<TrueFalse> mQuestionBank = new ArrayList<> (); @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); getQuestionsFromXML (); for (int i = 0; i < mQuestionBank.size (); i++) { Log.i (TAG, "Question: " + mQuestionBank.get (i).getQuestion () + "\n"); Log.i (TAG, "TEXT Answer ONE: " + mQuestionBank.get (i).getFirstAnswer ().getAnswerText () + "\n"); Log.i (TAG, "STATE Anser One:" + mQuestionBank.get (i).getFirstAnswer ().getState () + "\n"); Log.i (TAG, "TEXT Answer TWO: " + mQuestionBank.get (i).getSecondAnswer ().getAnswerText () + "\n"); Log.i (TAG, "STATE Anser TWO:" + mQuestionBank.get (i).getSecondAnswer ().getState () + "\n"); Log.i (TAG, "TEXT Answer THREE: " + mQuestionBank.get (i).getThirdAnswer ().getAnswerText () + "\n"); Log.i (TAG, "STATE Anser THREE:" + mQuestionBank.get (i).getThirdAnswer ().getState () + "\n"); Log.i (TAG, "TEXT Answer FOUR: " + mQuestionBank.get (i).getFourthAnswer ().getAnswerText () + "\n"); Log.i (TAG, "STATE Anser FOUR:" + mQuestionBank.get (i).getFourthAnswer ().getState () + "\n"); } } private void getQuestionsFromXML () { XmlPullParser parser = getResources ().getXml (R.xml.questions); String question = ""; TrueFalse item; String title = ""; boolean state; Answer answerOne = null; Answer answerTwo = null; Answer answerThree = null; Answer answerFour = null; try { while (parser.getEventType () != parser.END_DOCUMENT) { if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("question")) { question = parser.getAttributeValue (null, "title"); while (parser.getEventType () != parser.END_TAG) { title = parser.getAttributeValue (null, "title").toString (); if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("answer_one")) { if (parser.getText ().toString ().equals ("true")) { state = true; } else { state = false; } answerOne = new Answer (title, state); } if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("answer_two")) { title = parser.getAttributeValue (null, "title").toString (); if (parser.getText ().equalsIgnoreCase ("true")) { state = true; } else { state = false; } answerTwo = new Answer (title, state); } if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("answer_three")) { title = parser.getAttributeValue (null, "title").toString (); if (parser.getText ().equalsIgnoreCase ("true")) { state = true; } else { state = false; } answerThree = new Answer (title, state); } if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("answer_four")) { title = parser.getAttributeValue (null, "title").toString (); if (parser.getText ().equalsIgnoreCase ("true")) { state = true; } else { state = false; } answerFour = new Answer (title, state); } parser.next (); } item = new TrueFalse (question, answerOne, answerTwo, answerThree, answerFour); mQuestionBank.add (item); } parser.next (); } } catch (XmlPullParserException e) { e.printStackTrace (); } catch (Exception e) { e.printStackTrace (); } } } 

Actually, how to go through all the tags to put their values ​​in the ArrayList ? I simply do not display anything in the log. PS I still have 2 classes: TrueFalse - a class with a question, answer choices and the correctness of each answer and Answer - with a question title and correctness / incorrectness.

  • Why not use another parser? - katso
  • like what? - Arthur
  • for example dom .... - katso
  • Thanks for the hint, but it did not work out normally using the house. - Arthur
  • @Arthur Please post the found solution in the answer to your question . - Nicolas Chabanovsky

1 answer 1

DECISION

Redo XML as follows

 <quiz> <question title="Вопрос" answer_one_name="Первый ответ" answer_one_state="true" answer_two_name="Второй ответ" answer_two_state="false" answer_three_name="Третий ответ" answer_three_state="false" answer_four_name="Четвёртый ответ" answer_four_state="false"/> </quiz> 

Method code that parses XML

 private void getQuestionsFromXML () { XmlPullParser parser = getResources ().getXml (R.xml.questions); String question; TrueFalse item; Answer answerOne, answerTwo, answerThree, answerFour; try { while (parser.getEventType () != parser.END_DOCUMENT) { if (parser.getEventType () == parser.START_TAG && parser.getName ().equals ("question")) { question = parser.getAttributeValue (null, "title"); //каждый экземпляр класса Answer принимает на вход String (вариант ответа) и boolean (истинность ответа). //каждый экземпляр класса TrueFalse принимает String (вопрос) и 4 экземпляра Answer answerOne = new Answer (parser.getAttributeValue (null, "answer_one_name"), Boolean.valueOf (parser.getAttributeValue (null, "answer_one_state"))); answerTwo = new Answer (parser.getAttributeValue (null, "answer_two_name"), Boolean.valueOf (parser.getAttributeValue (null, "answer_two_state"))); answerThree = new Answer (parser.getAttributeValue (null, "answer_three_name"), Boolean.valueOf (parser.getAttributeValue (null, "answer_three_state"))); answerFour = new Answer (parser.getAttributeValue (null, "answer_four_name"), Boolean.valueOf (parser.getAttributeValue (null, "answer_four_state"))); item = new TrueFalse (question, answerOne, answerTwo, answerThree, answerFour); mQuestionBank.add (item); } parser.next (); } } catch (XmlPullParserException e) { e.printStackTrace (); } catch (Exception e) { e.printStackTrace (); } 

As far as I understand, XMLPullParser does not know how to work with nested tags, or I did not understand how to get it to work with them.