2014-02-27 3 views
-1

내 Eclipse android 응용 프로그램의 assets 폴더에 xml 파일이 있는데 읽고 싶습니다.애셋에서 xml 파일 읽기

<question> 
    <text>Most?</text> 
    <answer correct="false">10</answer> 
    <answer correct="true">11</answer> 
    <answer correct="false">8</answer> 
    <answer correct="false">9</answer> 
</question> 
<question> 
    <text>Which?</text> 
    <answer correct="false">Titanic</answer> 
    <answer correct="false">American</answer> 
    <answer correct="true">:King</answer> 
    <answer correct="false">Yes</answer> 
</question> 
<question> 
    <text>First?</text> 
    <answer correct="false">John</answer> 
    <answer correct="true">James</answer> 
    <answer correct="false">Peter</answer> 
    <answer correct="false">Jean</answer> 
</question> 

여기 내 코드입니다 :

while (eventType != XmlPullParser.END_DOCUMENT){ 
      String name = null; 
      switch (eventType){ 
       case XmlPullParser.START_DOCUMENT: 
        myItems = new ArrayList(); 
        break; 
       case XmlPullParser.START_TAG:       
       case XmlPullParser.TEXT: 
        name = parser.getName(); 
        if (name != null && answers == null && myItem == null) { 
         answers = new ArrayList(); 
         myItem = new MyItem(); 
        } 
        if (name.equals("text")){ 
         myItem.setQuestion(parser.nextText()); 
        } else if (name.equals("answer")){ 
         answers.add(new Answer(parser.nextText(), false)); 
         myItem.setAnswers(answers); 
        } 
        break; 
       case XmlPullParser.END_TAG: 
        name = parser.getName(); 
        if (name.equalsIgnoreCase("question") && quizItem != null){ 
         quizItems.add(quizItem); 
        } 
      } 
      eventType = parser.next(); 
     } 

지금이 작동하지 않습니다

여기에 파일의 텍스트입니다. 먼저 START_DOCUMENT에 대한 case 문이 입력됩니다. 두 번째 루프에서 TEXT case가 입력되고 parser.getName()의 값은 "text"입니다. '질문'은 건너 뜁니다. 왜 이런 일이 일어나는 걸까요?

+0

이 문서는 – Raghunandan

+0

내가 당신을 제안 할 것이라는 점을 확인 했의 좋은 예입니다 'SaxParser'를 사용하십시오 ... 다른 것들보다 쉽고 빠릅니다. –

+0

@HamidShatu xmlpullparser는 Google http://developer.android.com/training/basics/network-ops/xml.html에서 추천합니다. – Raghunandan

답변

0

당신은 당신은 참조를 위해 아래에 사용할 수있는 break 문을

case XmlPullParser.START_TAG: 

break; 

가 누락되었습니다. 코드가 자명하다면 좋겠습니다.

추가 정보 확인이 필요한 경우 문서는 좋은 예제가 있습니다.

http://developer.android.com/training/basics/network-ops/xml.html

public class XMLPullParserHandler { 

    private String text; 

    public XMLPullParserHandler() { 

    } 

    public Void parse(InputStream is) { // pass input stream 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 

      parser.setInput(is, null); 

      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tagname.equalsIgnoreCase("question")) { 

        } 
        else if (tagname.equalsIgnoreCase("answer")) { // is answer get the attribute 
         Log.i("Attribute true/false is",""+parser.getAttributeValue(null, "correct")); 
        } 
        break; 

       case XmlPullParser.TEXT: 
        text = parser.getText(); 
        break; 

       case XmlPullParser.END_TAG: // end tag 
        if (tagname.equalsIgnoreCase("question")) { 
         // add employee object to list 

        } else if (tagname.equalsIgnoreCase("text")) { // if text log the vlaue 
         Log.i("Question is",text); 
        } else if (tagname.equalsIgnoreCase("answer")) { // if answer log the value 

         Log.i("answer is",text); 
        } 
        break; 

       default: 
        break; 
       } 
       eventType = parser.next(); 
      } 

     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

로그 :

02-27 10:36:09.976: I/Question is(1955): Most? 
02-27 10:36:09.976: I/Attribute true/false is(1955): false 
02-27 10:36:09.976: I/answer is(1955): 10 
02-27 10:36:09.986: I/Attribute true/false is(1955): true 
02-27 10:36:09.986: I/answer is(1955): 11 
02-27 10:36:09.986: I/Attribute true/false is(1955): false 
02-27 10:36:09.986: I/answer is(1955): 8 
02-27 10:36:09.986: I/Attribute true/false is(1955): false 
02-27 10:36:09.986: I/answer is(1955): 9 
02-27 10:36:09.986: I/Question is(1955): Which? 
02-27 10:36:09.986: I/Attribute true/false is(1955): false 
02-27 10:36:09.986: I/answer is(1955): Titanic 
02-27 10:36:09.986: I/Attribute true/false is(1955): false 
02-27 10:36:09.986: I/answer is(1955): American 
02-27 10:36:09.986: I/Attribute true/false is(1955): true 
02-27 10:36:09.986: I/answer is(1955): :King 
02-27 10:36:09.996: I/Attribute true/false is(1955): false 
02-27 10:36:09.996: I/answer is(1955): Yes 
02-27 10:36:09.996: I/Question is(1955): First? 
02-27 10:36:09.996: I/Attribute true/false is(1955): false 
02-27 10:36:09.996: I/answer is(1955): John 
02-27 10:36:09.996: I/Attribute true/false is(1955): true 
02-27 10:36:09.996: I/answer is(1955): James 
02-27 10:36:09.996: I/Attribute true/false is(1955): false 
02-27 10:36:09.996: I/answer is(1955): Peter 
02-27 10:36:09.996: I/Attribute true/false is(1955): false 
02-27 10:36:09.996: I/answer is(1955): Jean 
0

게시 된 코드의 문제가 START_TAG 케이스가 TEXT 케이스까지 하락하고 있다는 점이다. 따라서 루프의 두 번째 반복에서 START_TAG 유형의 질문이 발생하지만 코드에서 TEXT 이벤트처럼 처리합니다.

덧붙여서, TEXT 이벤트 (혼란스럽게 명명 된 'text'요소와 반대)는 태그 사이의 각 문자열에 대해 반환됩니다. 이것이 의미하는 바를 알기 위해이 단순화 된 코드를 시도하고 로그를 검사하십시오. 그 코드에 대한

while (eventType != XmlPullParser.END_DOCUMENT) { 
    Log.i(TAG, String.format("Starting new iteration with name [%s]", xpp.getName())); 
    switch (eventType){ 
     case XmlPullParser.START_DOCUMENT: 
      Log.i(TAG, " found START_DOCUMENT"); 
      break; 
     case XmlPullParser.START_TAG:       
      Log.i(TAG, " found START_TAG"); 
      break; 
     case XmlPullParser.TEXT: 
      Log.i(TAG, String.format(" found TEXT with [%s]", xpp.getText())); 
      break; 
     case XmlPullParser.END_TAG: 
      Log.i(TAG, " found END_TAG"); 
    } 
    eventType = xpp.next(); 
} 

은 전체 첫 번째 질문 요소에 대한 로그 출력은 다음과 같습니다

Starting new iteration with name [null] 
    found START_DOCUMENT 
Starting new iteration with name [question] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
    ] 
Starting new iteration with name [text] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [Most?] 
Starting new iteration with name [text] 
    found END_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
    ] 
Starting new iteration with name [answer] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [10] 
Starting new iteration with name [answer] 
    found END_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
    ] 
Starting new iteration with name [answer] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [11] 
Starting new iteration with name [answer] 
    found END_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
    ] 
Starting new iteration with name [answer] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [8] 
Starting new iteration with name [answer] 
    found END_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
    ] 
Starting new iteration with name [answer] 
    found START_TAG 
Starting new iteration with name [null] 
    found TEXT with [9] 
Starting new iteration with name [answer] 
    found END_TAG 
Starting new iteration with name [null] 
    found TEXT with [ 
] 
Starting new iteration with name [question] 
    found END_TAG