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 항목의 리스트로 저장하는 코드입니다.
사용하는 방법은 그리 어렵지 않죠?
'안드로이드' 카테고리의 다른 글
[Android] 간단 코딩 - SwipeRefreshLayout을 이용하여 새로 고침하기 (0) | 2021.08.24 |
---|---|
[안드로이드] 알람(Alarm)을 받는 수신자(Receiver)에서 알림(Notification) 구현 코드 (2) | 2021.08.23 |
[안드로이드] 서울시 버스 도착 정보 조회 api 사용 - 공공데이터포털 Open API (0) | 2021.05.01 |
[안드로이드] RecyclerView 수평 이동 및 한번에 항목 하나만 보이게 만들기 (0) | 2020.07.01 |
[안드로이드] AsyncTask를 이용하여 시계(Timer) 구현 (0) | 2020.06.29 |