http://openapi.seoul.go.kr:8088/sample/xml/SearchConcertDetailService/1/5/35336/
위와 같은 xml 파일을 파싱해서 가져오고 싶습니다.
근본적 질문 :
만약에 <PLACE>문화일보홀</PLACE> 에서 문화일보홀을 가져오고 싶으면 어떻게 해야할까요?
제 아래 코드가 맞는 것인가요?
xml 파일에서 PLACE 와 TITLE 정보를 불러와서 리스트뷰를 꾸미는 것입니다.
물론 manifest에서 internet 퍼미션 주었습니다. (변수명 헷갈리니 주의해주세요 ㅠㅠ)
<MainActivity>
package com.example.show;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
String tagName,title,body,link=null;
String readLine,tv,urlStr;
ListView screen;
StringBuffer sb;
Button btn;
int eventType;
XmlPullParser xpp;
XmlPullParserFactory factory;
ArrayList<String> arrList;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.bt);
screen=(ListView) findViewById(R.id.screen);
arrList = new ArrayList<String>();
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrList);
screen.setAdapter(adapter);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
adapter.clear(); //어뎁터,리스트를 초기화시켜 새로운 데이터를 받음
arrList.clear();
adapter.notifyDataSetChanged(); //이까지. 초기화된걸 어뎁터로 리스트와 연결시켜줌
urlStr="http://openAPI.seoul.go.kr:8088/5959774871616b69343665784b4277/xml/SearchConcertDetailService/1/5/34121";
NetworkThread thread = new NetworkThread(); //스레드 선언과 호출
thread.setDaemon(true); //이거해줘야 종료될때 스레드가 죽는다는데 잘모르겠음
thread.start();
}});}
class NetworkThread extends Thread {
public void run() {
stream();
}}
Handler handler = new Handler(){
public void handleMessage(Message msg){
if(msg.what ==0){
adapter.notifyDataSetChanged();
}}};
public void parsing(){
try{
Log.d("444444", "parsing start");
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
xpp = factory.newPullParser();
xpp.setInput(new StringReader (tv.trim()));
eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT){ //최초 title테그안에 쓸데없는 내용이 있어서 추가해줬음.
if(eventType == XmlPullParser.START_TAG){ //ex)RSS 한경닷컴어쩌구저쩌구 제목과상관없는내용
String tagName2 = xpp.getName();
if(tagName2.equals("row")){ //아이템 테그 이후부터 검색시작
while (eventType != XmlPullParser.END_DOCUMENT){
if(eventType == XmlPullParser.START_TAG){ //스타트테그를 만나면 테그값 저장
tagName = xpp.getName();
}
else if(eventType == XmlPullParser.TEXT){ //스타트테그가 아니라 텍스트일경우
if(tagName!=null){ //텍스트가 쓰래기값인경우를 배제
if(tagName.equals("CODENAME")){ //필요한건 타이틀과 본문이기때문에 스타트테그는 타이틀일때 실행
title = xpp.getText().trim();
//if (title.length() > 0) { //여기도 한경닷컴특성상 제목 \n 공백 \n 제목 이런식으로돼있어서 추가
arrList.add(title);
// }
}else if(tagName.equals("PLACE")){ //스타트테그가 타이틀이 아니라 본문이면 마찬가지로 수행
link = xpp.getText().trim();
if(link.length()>0){
arrList.add(link);
}}}}
eventType = xpp.next();
}}}
eventType = xpp.next();
}
}catch (Exception e){}}
public void stream(){ //홈페이지 정보를 읽어들여 파서로 넘겨주기위한 매서드
HttpURLConnection urlConnection = null;
try {
URL url = new URL("http://openAPI.seoul.go.kr:8088/5959774871616b69343665784b4277/xml/SearchConcertDetailService/1/5/34121");
urlConnection = (HttpURLConnection) url.openConnection(); //url 연결
InputStream in = urlConnection.getInputStream(); //url내용을 비트형으로읽어옴
InputStreamReader isr = new InputStreamReader(in); // 뭐더라 다시 리더로 변환해주는과정
BufferedReader buf = new BufferedReader(isr); //줄단위로 읽어주기위해 실행
sb = new StringBuffer(); //buf의 한줄 한줄 값을 입력받아 한꺼번에 출력시키기 위해 사용
while (true) {
readLine = buf.readLine();
if (readLine == null) //읽어올 값이 없으면
break; //멈춤 그렇지않으면
sb.append(readLine); //스트링버퍼에 리드라인 내용 계속 추가
sb.append("\n"); //이게없으면 줄바꿈이없어서 알아보기가힘듦. buf의 줄바꿈단위마다 실행
}
Log.d("1111", "stream");
tv = sb.toString();
Log.d("2222", "toString");
parsing();
Log.d("33333", "parsing intro");
handler.sendEmptyMessage(0); //핸들러호출
}
catch (Exception e) {
}
finally {
if (urlConnection != null) {
urlConnection.disconnect();
}}}
}
<layout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="@+id/bt"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="파싱 정보 보기" />
<ListView
android:id="@+id/screen"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</RelativeLayout>