마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

xmlPullParser이용하는 법

0 추천

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>

 

SuperPro (860 포인트) 님이 2014년 8월 14일 질문

1개의 답변

0 추천
bool flag; 같은 변수를 주시고,

if (START_TAG가 "PLACE" 이면) flag = ture; 로 하시구요.

eventtype == text 일 때, flag가 true일 때만 값을 가져와서 저장하세요.

END_TAG가 다시 PLACE 이면, flag = false; 로 하시면 됩니다.
@didtmdtwt (1,410 포인트) 님이 2014년 8월 14일 답변
...