2013-08-08 6 views
0

Android 퀴즈 앱을 쓰고 있습니다. XML 파일에서 질문을로드하여 문자열에 넣은 다음 해당 문자열을 단추 텍스트로 사용하려고합니다.android에서 xml 구문 분석

XML 구문 분석에 문제가 있습니다. 나는 XmlPullParserFactoryXmlPullParser을 사용합니다. XMLResourceParser도 시도했지만 성공하지 못했습니다. 이 작업을 올바르게 수행하려면 어떻게해야합니까?

은 한 OnCreate에서 초기화입니다 :

XmlPullParserFactory pullParserFactory; 
    try { 
     pullParserFactory = XmlPullParserFactory.newInstance(); 
     XmlPullParser parser = pullParserFactory.newPullParser(); 
     InputStream in_s = getApplicationContext().getAssets().open("new_anwers.xml"); 
     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
     parser.setInput(in_s, null); 
     loadAnswers(parser); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

이러한 기능과 도우미 클래스입니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<new_answers> 
<answer1> 
    <text1>Zvonimir</text1> 
    <text2>Tomislav</text2> 
    <text3>Branimir</text3> 
    <text4>Viseslav</text4> 
</answer1> 
<answer2> 
    <text1>Stipe Mesic</text1> 
    <text2>Ivo Josipovic</text2> 
    <text3>Franjo Tuđman</text3> 
    <text4>Mate Granic</text4> 
</answer2> 
<answer3> 
    <text1>Hrvatski politicar</text1> 
    <text2>Hrvatski akademik</text2> 
    <text3>Hrvatski glazbenik</text3> 
    <text4>Hrvatski branitelj</text4> 
</answer3> 
</new_answers> 
:

void loadAnswers(XmlPullParser parser) throws XmlPullParserException,IOException 
{ 
    ArrayList<Answer> answers = null; 
    int eventType = parser.getEventType(); 
    Answer currAnswer = null; 

    while (eventType != XmlPullParser.END_DOCUMENT) { 
     String name = null; 

     switch(eventType){ 
     case XmlPullParser.START_DOCUMENT: 
      answers = new ArrayList(); 
      break; 
     case XmlPullParser.START_TAG: 
      name = parser.getName(); 
      if(name == "answer1") { 
       currAnswer = new Answer();     
      } else if (currAnswer != null) { 
       if(name == "text1") { 
        currAnswer.text1 = parser.nextText(); 
       } else if(name == "text2") { 
        currAnswer.text2 = parser.nextText(); 
       } else if(name == "text3") { 
        currAnswer.text3 = parser.nextText(); 
       } else if(name == "text4") { 
        currAnswer.text4 = parser.nextText(); 
       } 
      } 
      break; 
     case XmlPullParser.END_TAG: 
      name = parser.getName(); 
      if (name.equalsIgnoreCase("answer1") && currAnswer!= null){ 
       answers.add(currAnswer); 
      } 
     } 
     eventType = parser.next(); 
    } 
    setBtnTxt(answers); 
} 

class Answer { 
    String text1; 
    String text2; 
    String text3; 
    String text4; 
} 

void setBtnTxt(ArrayList<Answer> answers) {  
    String[] txt = new String[4]; 
    Iterator<Answer> it = answers.iterator(); 
    while(it.hasNext()) 
    { 
     Answer currAnswer = it.next(); 
     txt[1] = currAnswer.text1; 
     txt[2] = currAnswer.text2; 
     txt[3] = currAnswer.text3; 
     txt[4] = currAnswer.text4; 
    } 

    Button odgA = (Button) findViewById(R.id.button_OdgA); 
    Button odgB = (Button) findViewById(R.id.button_OdgB); 
    Button odgC = (Button) findViewById(R.id.button_OdgC); 
    Button odgD = (Button) findViewById(R.id.button_OdgD);  

    odgA.setText(txt[1]); 
    odgB.setText(txt[2]); 
    odgC.setText(txt[3]); 
    odgD.setText(txt[4]); 
} 
여기

는 응답의 XML입니다

+0

또한 일반적으로 XML 처리는 onCreate() 메서드에서 직접 수행하지 마십시오. UI 스레드에서 실행되므로 사용자가 응용 프로그램을 응답하지 않게됩니다. 대신 별도의 스레드에서 처리를 수행하므로 AsyncTask에서 수행하십시오. – Sundeep

답변

1

어떻게 올바르게 수행 할 수 있습니까?

직접 XML 파싱의 질문에 관련이없는,하지만 당신은 문자열 배열 형식으로 답변 XML을 변환하고 res/values/arrays.xml 안에 넣어 수 있다면 당신은 자신에게 XML을 구문 분석의 수고를 덜 수 있습니다. 코드에서 당신은 당신이 단순히 때문에

String[] options = getResources().getStringArray(R.array.answer_1); 

로 배열에 액세스 할 수

<answer1> 
    <text1>Zvonimir</text1> 
    <text2>Tomislav</text2> 
    <text3>Branimir</text3> 
    <text4>Viseslav</text4> 
</answer1> 

이 코드에서

<string-array name="answer_1"> 
     <item>Zvonimir</item> 
     <item>Tomislav</item> 
     <item>Branimir</item> 
     <item>Viseslav</item> 
</string-array> 

것, 예를 들어 R.array.<answer_name_id>

사용하여 액세스 할 수 있습니다 당신은 많은 배열을 가지고있다. 당신은 모든 배열에 대한 참조를 보유 할 int 배열을 정의 할 수있다.

public static final int[] ALL_ANSWERS = { 
     R.array.answer_1, 
     R.array.answer_2, 
     R.array.answer_3, 
     R.array.answer_4, 
     R.array.answer_5} 

그리고 일부에서 XML을 다운로드하는 경우 당신은 그러나

String[] options = getResources().getStringArray(ALL_ANSWERS[index]); 

에서 단순히 루프 또는 액세스하여 원하는 대답 경우 다른이 작동하지 않습니다 수있는 코드에서

. 모든 답변이 앱에 패키지되어있는 경우에만 작동합니다.

+1

감사합니다. 많은 시간을 절약 해주었습니다. – user2622378

+0

@Sundeep이 경우 질문의 텍스트는 어디에 넣을까요? –

+1

@petko_stankoski 별도의 배열에 넣거나 동일한 배열의 첫 번째 요소로 넣을 수 있습니다. 전 질문과 옵션이 분리되어 있으므로 [Collections.shuffle()] (http://docs.oracle.com/javase/7/docs/api/java/) 옵션을 쉽게 잡아 당길 수 있으므로 전자를 선호합니다. util/Collections.html # shuffle (java.util.List)를로드 할 때 순서를 유지해야합니다. 질문을 삭제하면 해당 옵션을 찾아서 삭제해야합니다. 두 번째 경우 전체 배열을 삭제하는 것으로 충분합니다. – Sundeep