Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) RSS 구현1 - XmlResourceParser 를 이용하여 XML 파싱하기

 

환경 : Eclipse Mars, Android 4.2.2

 

이번예제는 XmlResourceParser 를 이용하여 resource 에서 읽어온 데이터를 파싱하는 예제 입니다. 파싱할 XML 파일은 res/xml 폴더에 있으며 여러 요소로 xml 을 요소명과 내부에 포함된 텍스트 값을 분리해서 화면에 보여줄 것입니다.

 

안드로이드(Android) RSS 구현1 - XmlResourceParser 를 이용하여 XML 파싱하기

 

샘플을 만들기 전에 분석할 XML 파일을 만듭니다. res/xml 폴더에 parsing_data.xml 로 생성합니다.

 

<?xml version="1.0" encoding="utf-8"?>
<rootelement1>
    <subelement>
 	subelement 요소의 값
    </subelement>
    <subelement>
	두번째 subelement 요소의 값
	<subsubelement>
	    두번째 subelement 의 subsubelement 요소의 값
	</subsubelement>
    </subelement>
</rootelement1>

 

먼저 파싱을 하기 위해 resource 폴더에서 XML 데이터를 읽어 옵니다. activity.getResource() 함수로 Resources 객체를 리턴 받습니다. 그리고 getXml() 함수로 샘플로 만들어 놓은 parsing_data.xml 읽어 옵니다.

 

Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.xml.parsing_data);

 

이렇게 XmlResourceParser 객체에 리턴받은 받은후 next() 함수로 읽을 준비를 합니다. 그리고 getEventType() 으로 현재 읽어 올 데이터의 형태를 판단하게 됩니다. 형태는 총 4가지 입니다.

 

l  STATR_DOCUMENT : XML 문서의 시작을 알려줍니다.

l  START_TAG : 요소의 시작 태그 이름을 가져옵니다.

l  ENT_TAG : 요소의 종료 태그 이름을 가져옵니다

l  TEXT : 시작과 종료태그에 싸여있는 Text 값을 가져옵니다.

l  END_DOCUMENT : XML 문서의 종료를 알려줍니다.

 

While 문을 돌려 ENT_DOCUMNET 가 나올 때 까지 돌면서 각 요소명과 Text 값을 읽어옵니다. XML 요소 태그명은 getName() 으로 읽어오고 요소에 싸인 Text 값은 getText() 로 읽어옵니다. 그렇게 읽어온 전체 값을 StringBuffer 객체에 저장한 후 String 으로 리턴합니다.

 

private String getEventsFromAnXML(Activity activity) 
		throws XmlPullParserException, IOException {
	
	StringBuffer stringBuffer = new StringBuffer();
	Resources res = activity.getResources();
	XmlResourceParser xpp = res.getXml(R.xml.parsing_data);
	xpp.next();
	int eventType = xpp.getEventType();
	while (eventType != XmlPullParser.END_DOCUMENT) {
		if (eventType == XmlPullParser.START_DOCUMENT) {
			stringBuffer.append("----- XML 분석 시작 ------");
		} else if (eventType == XmlPullParser.START_TAG) {
			stringBuffer.append("\nSTART_TAG: " + xpp.getName());
		} else if (eventType == XmlPullParser.END_TAG) {
			stringBuffer.append("\nEND_TAG: " + xpp.getName());
		} else if (eventType == XmlPullParser.TEXT) {
			stringBuffer.append("\nTEXT: " + xpp.getText());
		}
		eventType = xpp.next();
	}
	stringBuffer.append("\n--- XML 분석 끝 ---");
	return stringBuffer.toString();
}

 

Xml 파싱을 위한 전체 activity 소스 입니다.


import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.widget.TextView;

public class XmlParserActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_xml_parser);

		TextView myXmlContent = (TextView) findViewById(R.id.xmlData);
		String stringXmlContent;
		try {
			stringXmlContent = getEventsFromAnXML(this);
			myXmlContent.setText(stringXmlContent);
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private String getEventsFromAnXML(Activity activity) 
			throws XmlPullParserException, IOException {
		
		StringBuffer stringBuffer = new StringBuffer();
		Resources res = activity.getResources();
		XmlResourceParser xpp = res.getXml(R.xml.parsing_data);
		xpp.next();
		int eventType = xpp.getEventType();
		while (eventType != XmlPullParser.END_DOCUMENT) {
			if (eventType == XmlPullParser.START_DOCUMENT) {
				stringBuffer.append("----- XML 분석 시작 ------");
			} else if (eventType == XmlPullParser.START_TAG) {
				stringBuffer.append("\nSTART_TAG: " + xpp.getName());
			} else if (eventType == XmlPullParser.END_TAG) {
				stringBuffer.append("\nEND_TAG: " + xpp.getName());
			} else if (eventType == XmlPullParser.TEXT) {
				stringBuffer.append("\nTEXT: " + xpp.getText());
			}
			eventType = xpp.next();
		}
		stringBuffer.append("\n--- XML 분석 끝 ---");
		return stringBuffer.toString();
	}
}
Posted by 녹두장군

댓글을 달아 주세요