ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • XmlPullParser를 이용한 파싱방법
    예전 글들/Android 2011. 6. 22. 11:08
    반응형

    미쳐버릴 정도로 날 괴롭힌 녀석 XML

    우선 내가 파싱하고 싶었던 데이터는

    <person>

           <student>

                 <num>1</num>

                 <name>Yang YuMi</name>

                 <university>Korea University</university>

                 <major>English History</major>

                 <valunteer>Yes</valunteer>

                 <language>English, Russian, Japaness</language>

                 <hobby>Dance Sports</hobby>

                 <talent>Sing</talent>

           </student>

           <student>

                 <num>2</num>

                 <name>Kim JunhMin</name>

                 <university>SukMyung University</university>

                 <major>Language Information</major>

                 <valunteer>Yes</valunteer>

                 <language>English, Japaness</language>

                 <hobby>Movie, Travel</hobby>

                 <talent>English, Japaness</talent>

           </student>

           <student>

                 <num>3</num>

                 <name>Jung MinJu</name>

                 <university>InHa University</university>

                 <major>Architector</major>

                 <valunteer>Yes</valunteer>

                 <language>English, French, Japaness</language>

                 <hobby>Playing Guitar, Draw Picture</hobby>

                 <talent>French</talent>

           </student>

    </person>

     

    이런 식이었고 책에는 대부분 학생 노드 아래 하나의 노드에 하나의 Text만 있는지라 프로그래밍 실력이 부족해서 인지 아무튼 XML 파일에 있는 위의 데이터를 String 객체에 집어 넣는데 까지는 성공했는데 DOM파서를 써서 불러오면 null값이 불러진다 던지, 아니면 node의 이름만(num, name 같은 것들) 불러와서 참 고생했습니다. 아래 방법은 XmlPullParser를 이용한 해결책입니다. DOM 파서를 사용해보고 싶었는데 잘 안되더라구요.

     

    우선 XML파일 위치는 프로젝트에 [assets] 폴더를 생성하고 그 안에 집어 넣었습니다. String 객체에 집어 넣는 방법은 아래와 같습니다.

    try {

                  personXMLString = getXMLFileFromAssets();

           } catch (IOException e) {

                 // TODO Auto-generated catch block

                        e.printStackTrace();

           }

    }

    위의 소스는 public void onCreate(Bundle savedInstanceState에서 넣었습니다. 물론 다른 곳에서 호출해도 상관없다는 거 잘아시죠?

    personXMLString String으로 getXMLFileFromAssets(); XML 파일에서 String으로 저장한 것을 리턴해 준 값을 받습니다. 좀 더 자세한 것은 아래 getXMLFileFromAssets() 를 보시면 알 수 있을 겁니다.

    private String getXMLFileFromAssets() throws IOException {

                

                 AssetManager assetManager = getResources().getAssets();

                 AssetInputStream ais = (AssetInputStream)assetManager.open("personinfo.xml");     

                 BufferedReader br = new BufferedReader(new InputStreamReader(ais));

          

                 String line;

                 StringBuilder data = new StringBuilder();

                 while((line=br.readLine()) != null)

                        data.append(line);

                 Log.i("getXML", data.toString());

                

                 return data.toString();

                

           }

    보시기 어려우면 Eclipse에 복사해서 보시면 쉬우실 겁니다. personinfo.xml 에서 데이터를 뽑아내서 String에 저장합니다.

     

    그리고 가장 중요한 XmlPullParser를 이용한 각각의 데이터를 저장하는 법입니다.

    private void PullParserFromXML(String data) {

                 boolean boolean_num = false,

                               boolean_name = false,

                               boolean_university = false,

                               boolean_major = false,

                               boolean_valunteer = false,

                               boolean_language = false,

                               boolean_hobby = false,

                               boolean_talent = false,

                 boolean done = false;

                

                 try{

                        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

                        XmlPullParser parser = factory.newPullParser();

                        String sTag;

                        parser.setInput(new StringReader(data));

                       

                        int eventType = parser.getEventType();

                       

                        while(eventType != XmlPullParser.END_DOCUMENT) {

                               switch(eventType) {

                               case XmlPullParser.START_DOCUMENT:            // 문서의 시작

                                     Person = new ArrayList<pesronData>();

                                     break;

                                    

                               case XmlPullParser.END_DOCUMENT:        // 문서의

                                     break;

                                    

                               case XmlPullParser.START_TAG:                 // 시작 태그를 만나면 이름을 살펴봐서 작업(아무 일도 안하거나 값을 읽어 저장

                                     sTag = parser.getName();

                                     if(sTag.equals("student"))

                                            StudentData = new personData();

                                     if(sTag.equals("num"))

                                            boolean_num = true;

                                     else if(sTag.equals("name"))

                                            boolean_name = true;

                                     else if(sTag.equals("university"))

                                            boolean_university = true;

                                     else if(sTag.equals("major"))

                                            boolean_major = true;

                                     else if(sTag.equals("valunteer"))

                                            boolean_valunteer = true;

                                     else if(sTag.equals("language"))

                                            boolean_language = true;

                                     else if(sTag.equals("hobby"))

                                            boolean_hobby = true;

                                     else if(sTag.equals("talent"))

                                            boolean_talent = true;

                                     break;

                                    

                               case XmlPullParser.END_TAG:                   // End 태그를 만나면

                                     sTag = parser.getName();

                                     if(sTag.equalsIgnoreCase("student") && StudentData != null){

                                            Person.add(StudentData);

                                     }

                                     break;

                                    

                               case XmlPullParser.TEXT:

                                     if(boolean_num) {

                                            StudentData.setPersonNum(parser.getText());

                                            boolean_num = false;

                                     } else if(boolean_name) {

                                            StudentData.setPersonName(parser.getText());

                                            boolean_name = false;

                                     } else if(boolean_university) {

                                            StudentData.setPersonUniversity(parser.getText());

                                            boolean_university = false;

                                     } else if(boolean_major) {

                                            StudentData.setPersonMajor(parser.getText());

                                            boolean_major = false;

                                     } else if(boolean_valunteer) {

                                            StudentData.setPersonValunteer(parser.getText());

                                            boolean_valunteer = false;

                                     } else if(boolean_language) {

                                            StudentData.setPersonLanguage(parser.getText());

                                            boolean_language = false;

                                     } else if(boolean_hobby) {

                                            StudentData.setPersonHobby(parser.getText());

                                            boolean_hobby = false;

                                     } else if(boolean_talent) {

                                            StudentData.setPersonTalent(parser.getText());

                                            boolean_talent = false;

                                     break;

                               }                               

     

                               eventType = parser.next();

                        }

                        Log.i("PullXML", Person.get(0).getPersonNum() + " " + Person.get(0).getPersonMajor());

                        Log.i("PullXML", Person.get(1).getPersonNum() + " " + Person.get(0).getPersonMajor());

                        Log.i("PullXML", Person.get(2).getPersonNum() + " " + Person.get(0).getPersonMajor());

                 } catch(Exception ex) {

                       

                 }

           }

    화면에 어찌 보이실지는 모르겠지만 처음 보시면 매우 복잡해 보이겠지만 자세히 들여다 보시면 참 쓸 때 없이 복잡한 소스입니다. 이렇게 짜면서도 과연 이렇게 밖에 도리가 없는가라는 의구심이 계속 들었지만 우선 이렇게 하면 저장은 할 수 있습니다.

    소스를 자세히 보시면 Person, StudentData 가 있는데 아래와 같이 소스 시작 전에 선언해 준 값입니다.

    List<personData> Person = null;

           personData StudentData = null;

    위의 personData는 클래스로 만든 것입니다. 소스는 아래와 같아요.

    public class PersonData {

           private String personNum;

           private String personName;

           private String personUniversity;

           private String personMajor;

           private String personValunteer;

           private String personLanguage;

           private String personHobby;

           private String personTalent;

           private String personMainPhoto;

           private String personUtubeURL;

          

           public String getPersonNum() {

                 return personNum;

           }

           public void setPersonNum(String personNum) {

                 this.personNum = personNum;

           }

           public String getPersonName() {

                 return personName;

           }

           public void setPersonName(String personName) {

                 this.personName = personName;

           }

           public String getPersonUniversity() {

                 return personUniversity;

           }

           public void setPersonUniversity(String personUniversity) {

                 this.personUniversity = personUniversity;

           }

           public String getPersonMajor() {

                 return personMajor;

           }

           public void setPersonMajor(String personMajor) {

                 this.personMajor = personMajor;

           }

           public String getPersonValunteer() {

                 return personValunteer;

           }

           public void setPersonValunteer(String personValunteer) {

                 this.personValunteer = personValunteer;

           }

           public String getPersonLanguage() {

                 return personLanguage;

           }

           public void setPersonLanguage(String personLanguage) {

                 this.personLanguage = personLanguage;

           }

           public String getPersonHobby() {

                 return personHobby;

           }

           public void setPersonHobby(String personHobby) {

                 this.personHobby = personHobby;

           }

           public String getPersonTalent() {

                 return personTalent;

           }

           public void setPersonTalent(String personTalent) {

                 this.personTalent = personTalent;

           }

           public String getPersonMainPhoto() {

                 return personMainPhoto;

           }

           public void setPersonMainPhoto(String personMainPhoto) {

                 this.personMainPhoto = personMainPhoto;

           }

           public String getPersonUtubeURL() {

                 return personUtubeURL;

           }

           public void setPersonUtubeURL(String personUtubeURL) {

                 this.personUtubeURL = personUtubeURL;

           }

    }

    Eclipse를 사용하면 쉽게 만들 수 있으니 참고하세요.

     

    이것저것 시도하면서 배운 것도 많지만, 아직 수정해야 될 부분이 많아 보입니다. 딱 봐도 효율성도 엄청 부족한 점이 많고요. 수정할지는 불확실하지만 좀 더 나은 방법으로 수정하게 되면 올리도록 하죠. 커뮤니티에 올려볼까??

    그리고 마지막으로 위의 문제를 해결할 수 있었던 블로그입니다. 누구신지는 모르겠지만 진심 감사하게 느낍니다. 서로서로 돕고 사는 게 인터넷 문화 아니겠습니까?

    http://gaspotion.tistory.com/entry/Xmlparser-%EA%B8%B0%EB%B3%B8-%EC%98%88%EC%A0%9C


    반응형

    댓글

Designed by Tistory.