Android XmlPullParser with EUC-KR
Android XmlPullParser with EUC-KR
안드로이드에서 제공하는 XML 파서인 XmlPullParser에서 한글을 포함한 XML문서를 사용하는 예
XmlPullParser를 사용하여 태그의 속성 값을 사용하는 내용도 포함하고 있음
참고 : AndroidManifest.xml 에 다음 항목을 추가해야 인터넷에 접속할 수 있음
<uses-permission android:name="android.permission.INTERNET" />
서버측(JSP)
<?xml version="1.0" encoding="EUC-KR" ?>
<%@ page contentType="text/xml; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<fruits>
<fruit num="1">
<name>오렌지</name>
<price>2000</price>
</fruit>
<fruit num="2">
<name>Melon</name>
<price>3000</price>
</fruit>
<fruit num="3">
<name>Apple</name>
<price>4000</price>
</fruit>
</fruits>
클라이언트 측(Android Activity)
package test.android.hello;
import java.net.*;
import java.io.*;
import org.xmlpull.v1.*;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class AndroidWeb extends Activity {
TextView textview;
URLConnection conn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textview = (TextView) this.findViewById(R.id.tv);
try {
// Construct data
String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("홍길동", "UTF-8");
// Send data
URL url = new URL("http://211.183.3.170:8282/WebTest/android/fruits.jsp");
conn = url.openConnection();
// If you invoke the method setDoOutput(true) on the URLConnection, it will always use the POST method.
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(),"EUC-KR"));
String line = null;
String response = "";
while ((line = rd.readLine()) != null) {
response += line;
}
findName(response);
//textview.setText(response.trim());
wr.close();
rd.close();
}
catch (Exception e) {
}
}
/* XmlPullParser 와 XML태그의 속성을 이용, 특정 엘리먼트의 값을 추출하는 예 */
private void findName(String xmlString) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput( new StringReader ( xmlString));
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
Log.i("Start document","시작태그");
} else if(eventType == XmlPullParser.START_TAG) {
Log.i("Start tag", ""+xpp.getName());
String tagName = xpp.getName();
if(tagName.equals("fruit")) {
String num = xpp.getAttributeValue(0);
Log.i("속성 값", num);
}
int cnt = xpp.getAttributeCount();
if(cnt != -1) {
for(int i=0;i<cnt;i++) {
if(xpp.getAttributeName(i).equals("num")) {
if(xpp.getAttributeValue(0).equals("1")) {
//Log.i("찾음", "1번");
xpp.next(); // empty TEXT
xpp.next(); // name element
xpp.next(); // TEXT(오렌지)
String fruitName = xpp.getText(); // 오렌지
xpp.next(); // </name>
xpp.next(); // empty TEXT
xpp.next(); // price element
xpp.next(); // 2000
String priceValue = xpp.getText();
Log.i(fruitName, priceValue);
textview.setText(fruitName+":"+priceValue);
}
}
}
}
} else if(eventType == XmlPullParser.END_TAG) {
Log.i("End tag", ""+xpp.getName());
} else if(eventType == XmlPullParser.TEXT) {
Log.i("TEXT", ""+xpp.getText());
}
eventType = xpp.next();
}
} catch (Exception e) {
Log.e("오류", ""+e.getMessage());
}
Log.e("종료", "프로그램 종료");
}
}