XmlPullParser

Xml을 안드로이드에서 파싱하는 방법은 XmlPullParser라는 녀석으로 파싱할 수 있습니다. 사용법만 알면 누구든 쉽게 파싱할 수 있습니다.

일단 다음과 같은 xml이 있다고 쳐보도록 하겠습니다. 아래는 공공데이터포탈의 버스 위치 정보의 xml파일입니다. 

...
<busLocationList>
  <endBus>0</endBus>
  <lowPlate>0</lowPlate>
  <plateNo>경기70사1109</plateNo>
  <plateType>3</plateType>
  <remainSeatCnt>38</remainSeatCnt>
  <routeId>233000031</routeId>
  <stationId>202000217</stationId>
  <stationSeq>60</stationSeq>
</busLocationList>
<busLocationList>
  <endBus>0</endBus>
  <lowPlate>0</lowPlate>
  <plateNo>경기70사1139</plateNo>
  <plateType>3</plateType>
  <remainSeatCnt>42</remainSeatCnt>
  <routeId>233000031</routeId>
  <stationId>200000321</stationId>
  <stationSeq>8</stationSeq>
</busLocationList>
...

 

위의 xml을 파싱하는 방법은 아래의 코드 예제로 이해가 가능합니다. 우선 두가지 클래스 XmlPullParser와 XmlPullParserFactory가 필요합니다. 그리고 예외를 핸들링하려면 XmlPullParserException가 필요합니다. 이것들을 우선 import하고 아래의 코드를 통해 봅시다. 

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserException;

import org.xmlpull.v1.XmlPullParserFactory;

 

우선 웹에서 응답을 가져오는 코드이기 때문에 Thread를 사용하여야합니다. 아래의 코드는 run을 오버라이드한 코드입니다.

 

    @Override
    public void run() {

        try {

            URL url = new URL(requestUrl);
           
            XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
            parser = xmlPullParserFactory.newPullParser();
         
            InputStream is = url.openStream();
            parser.setInput(new InputStreamReader(is, "UTF-8"));
            String tagName="";
            
            //event type얻어오기
			int eventType = parser.getEventType();

			//xml문서의 끝까지 읽기
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				//태그가 시작
					case XmlPullParser.START_TAG:
						tagName=parser.getName();
						if (parser.getName().equals("busLocationList")) {
							//객체 생성
							BusLocation location=new BusLocation();
						}
						break;
				//태그의 끝
					case XmlPullParser.END_TAG:
						if (parser.getName().equals("busLocationList")) {
							//객체를 리스트에 추가
							locationList.add(location);
						}
						break;
				//태그 안의 텍스트
					case XmlPullParser.TEXT:
				
						switch(tagName) {
							case "endBus":{
								location.endBus=parser.getText();
								break;
							}
							case "lowPlate":{
								location.lowPlate=parser.getText();
								break;
							}
							case "plateNo":{
								location.plateNo=parser.getText();
								break;
							}
							case "plateType":{
								location.plateType=parser.getText();
								break;
							}
							case "remainSeatCnt":{
								location.remainSeatCnt=parser.getText();
								break;
							}
							case "routeId":{
								location.routeId=parser.getText();
								break;
							}
							case "stationId":{
								location.stationId=parser.getText();
								break;
							}
							case "stationSeq":{
								location.stationSeq=parser.getText();
								break;
							}
						}
						break;
				}
                //다음으로 이동
				eventType = parser.next();
			}

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

 

while을 통해서 xml의 끝까지 돌아야하는데, 이때 XmlPullParser의 END_DOCUMENT를 통해서 알 수 있습니다. 그리고 그 외 시작 태그를 알 수 있는데 XmlPullParser의 START_TAG로 알 수 있습니다. 비슷하게 태그가 닫히는 부분은 END_TAG로 알 수 있습니다.  태그의 이름은 getName으로 알 수 있지요.

태그안의 내용은 XmlPullParser의 TEXT로 알 수 있고, 실제 내용은 getText 메소드로 알 수 있습니다. 위 코드는 응답받은 xml을 busLocationList 항목의 리스트로 저장하는 코드입니다.

사용하는 방법은 그리 어렵지 않죠?

반응형
블로그 이미지

REAKWON

와나진짜

,