Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

Dev.

Android SQL Parser [1. DomParser ] 본문

Android

Android SQL Parser [1. DomParser ]

Pppdw 2014. 2. 15. 05:10

 

Dom Parser? 

돔파서, 안드로이드에서  JSP페이지의 XML값을 가져오는 방법입니다.

일단 돔파서는 어떤 태그, 즉 루트로 접속을해서 그 루트를 일종의 트리(좋은예로 카테고리가있네요)

형태로 펼칩니다. 그리고 그 루트안에 들어있는 자식 노드들을 읽어드립니다.

단순히말해서, 특정 루트를 읽어오는 속도가 상상이상으로 굉장히빠릅니다. 그리고 특정노드를 여러번

읽을 수도 있구요. 

문제는 일단 루트를 펼치고->노드를 읽는다. 방식이기때문에, 루트를 펼쳐 트리를 만드는시간

즉, 첫 스타트로딩이 좀있구요. 루트안에 노드가 많아서 좀 무거워진다면 읽는데 메모리를 좀쓴다,

뭐이정도의 단점이있겟네요.

그럼 구현해봅시다. 

이방법을 잘쓴다면, JSP페이지에 DB값을 XML형태로 파싱하여 올리고, 그값을 Android에서 읽어옴

으로써, Android의 DB접근법중 하나가 되겠죠?

 



1. JSP 페이지의 설정 

딴거 없습니다. 일단 톰캣까지는 추가설명없이 그냥 넘어가겠습니다~

시작엔 JSP 임의의 페이지를 하나 만들어봅시다.

이렇게 [루트]-[노드]-[노드]-[노드]-.....[노드]-[/루트] 식으로 코딩 하시면됩니다.


해당 소스입니다.

 

<%@ page language="java" contentType="text/xml;charset=UTF-8" pageEncoding="UTF-8"%>

<order>

<item>잘 읽어오나요?</item>

<item>예 읽어오네요!</item>

<item>성공했습니다! </item>

<item>Pppdwer.tistory.com </item>

<item>흔하지 않은 디벨로퍼 였습니다. </item>

<item>좋은 하루되세요! </item>

</order>

결과 페이지입니다.



이로써 JSP페이지의 설정부는 끝났습니다~ 간단허네요~

 



 2. 저는 저 XML값을 ListView의 형태로 가져오겠습니다.

고로 레이아웃설정을 해야겠지요??

간단합니다. 리스트뷰로 다량의 데이터를 실시간으로 가지고올꺼면!

리스트어댑터를 사용해야하고, 그걸쓸라면 리스트 액티비티를 상속, 레이아웃의 리스트뷰 

아이디를 시스템디폴트로 잡아주셔야합니다! 좀말이 이상하지만 보면 쉽습니다!

소스코드를 첨부 하겠습니다.

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

    

    <ListView

        android:id="@android:id/list"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"/>


</LinearLayout>

제가 소스코드 올리는걸 못해서 복붙하는게아닙니다...휴

남들 다 올리는소스코드 저만특별하게 올릴려고 이렇게올리는겁니다, 절대 툴못써서 이러는거 아닙니다

ㅠㅠ 

여튼 저쪽 리스트뷰 아이디보시면!  android:id="@android:id/list" 이렇게 되어야 합니다!

안그러면 아마 어댑터연결할때 에러뜨고 팅길거에요~

 



3. Android 코딩 부분입니다.

 일단 JSP페이지로 들어갈꺼고 즉, 인터넷을 쓴다는 말이죠?

퍼미션부에서 android.permission.INTERNETuses-permission으로 추가해줍니다.

이렇게~!



저는 DOM 이라는 클래스로 구현을 해보겠습니다.

일단 본론으로 들어가자면, 리스트뷰로 구현한다 했죠?

그럼 ListActivity를 상속 받아야겠네요, 필요한 메서드들을 생각하고 하나하나 코딩해봅시다.

먼저 첫실행시 스타트되어야하는, 즉 서버를 읽으러 출동하는 메서드가 필요합니다.

저는 이자식을 svReader() 라 칭하겠습니다, 일단 전 이놈한테 쓰레드를 하나 쥐어줄것이고

(=Runnalbe) 이 러네이블은 제가 지정한 url로 날아가서 HttpGet/Response/Entity 등

제가 필요한 여러가지 정보를 얻어와 줍니다! 물론 try/catch문으로 하셔야 오류로그없이

정상구동될겁니다~ 그럼 svReader()를 한번 코딩해볼까요?

아래는 소스내역입니다.

 

private void svReader(){

                Thread thread = new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

String url = "접속 하고자하는 url" ;

HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);

HttpEntity httpEntity = httpResponse.getEntity();

if(httpEntity != null){

String resString = EntityUtils.toString(httpEntity,"UTF-8");

Message message = parserHandler.obtainMessage();

message.obj = resString;

parserHandler.sendMessage(message);

}

} catch (ClientProtocolException e) {

} catch (ParseException e){

} catch (IOException e){

}

}

});

progressDialog = ProgressDialog.show(DOM.this, "기다리세요", "얻어오는 중이에요~!");

thread.start();

}

 저렇게 코딩이 됬습니다, 언급이 없었던 메세지객체는 제가 스레드스타트시 핸들러에게

저메세지를 보내고 그걸 신호로 서버를 읽기시작한다 뭐 이런뜻입니다.

그아래쪽 프로세스바는 돔파서 시작부분에서 언급했듯이, 루트(오더)가 무거워지면

트리를 펼칠때까지의 시간이 좀걸려요, 그시간동안 사용자 눈심심하지말라고 넣은건데

여튼 사용하실려면 별도로 임포트 시켜주셔야합니다,

자 그럼 이제 메세지객체를 핸들러가 전달받고 핸들러가 작업을 수행하게끔 하는일만 남았네요.

음 핸들러는 XML값이 다받아진다면, 프로세스다이얼록을 닫고, 다른메서드를 호출할껍니다.

여기서 다른 메서드는 받아온 XML값을 리스트뷰에 뿌려주는 그런 역활을 맡겠죠?

그럼 두번째. 핸들러객체인 parserHandler() 메서드를 정의해봅시다.

소스는 바로 아래입니다.

 

     private Handler parserHandler = new Handler(){

@Override

public void handleMessage(Message msg){

progressDialog.dismiss();

XMLReader((String)msg.obj);

}

}; // 말만 거창하지, 간단하기 그지없죠?

     //설명하자면, svReader()가 XML값을 다가져오면 핸들러가 호출됩니다. 그러면 프로세스

  //다이얼록이 닫히고, 그 XML을 msg.obj에 담아서 이다음 정의할 메서드인 XMLReader()로 

 //전송합니다. 그럼 XMLReader는 받아온 XML값들을 ListView에 Add시킵니다. 끝 간단허죠?

 

 이제 리스트뷰에 아이템을 뿌려줄 친구, XMLReader()메서드를 소개할겁니다.

이것도 뭐딱히 설명할건없네요, 와일문을 이용해서 받아온 오더속의 아이템들을 전부 뿌려주겠다는

선언밖에 없습니다. 한번 보겠습니다

 

private void XMLReader(String xml){

try{

DocumentBuilderFactory DBfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder DBbuilder = DBfactory.newDocumentBuilder();

InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));

Document document  = DBbuilder.parse(is);

Element order = (Element)document.getDocumentElement();

NodeList nodelist = order.getElementsByTagName("item");

list = new ArrayList<String>();

int i=0;

while(i < nodelist.getLength()){

Node node = nodelist.item(i);

Node list1 = node.getFirstChild();

XML1 = list1.getNodeValue();

list.add(XML1);

i++;

}

adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list);         

       setListAdapter(adapter);

}catch (UnsupportedEncodingException e){

}catch (ParserConfigurationException e){

}catch (SAXException e){

}catch (IOException e){

}

}

 말 그대로죠? 핵심작업은 와일문에서 진행합니다. i값과 받아온 노드리스트(노드아닙니다,노드의 갯수

라고생각하심이 빠릅니다) 비교해서 계속적으로 리스트뷰 하나하나에 애드시켜줍니다.

실행시켜볼까요? 


호~ 앞에서 선언한 JSP페이지의 XML형태 오더에 대해, 자식노드들을 제대로 가지고왔네요!

이상으로 포스팅끝!

전체소스내역은 아래첨부하겠습니다

 


//DOM.class의 전체 입니다.


        public class DOM extends ListActivity {

ProgressDialog progressDialog;

String XML1;

ArrayList<String> list;

        ArrayAdapter<String> adapter;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.dom);

   svReader();

   // TODO Auto-generated method stub

}

private void svReader(){

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

         String url = "";

HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);

HttpEntity httpEntity = httpResponse.getEntity();

if(httpEntity != null){

String resString = EntityUtils.toString(httpEntity,"UTF-8");

Message message = parserHandler.obtainMessage();

message.obj = resString;

parserHandler.sendMessage(message);

}

} catch (ClientProtocolException e) {

} catch (ParseException e){

} catch (IOException e){

}

}

});

progressDialog = ProgressDialog.show(DOM.this, "기다리세요", "얻어오는 중이에요~!");

thread.start();

}

private Handler parserHandler = new Handler(){

@Override

public void handleMessage(Message msg){

progressDialog.dismiss();

XMLReader((String)msg.obj);

}

};

private void XMLReader(String xml){

try{

DocumentBuilderFactory DBfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder DBbuilder = DBfactory.newDocumentBuilder();

InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));

Document document  = DBbuilder.parse(is);

Element order = (Element)document.getDocumentElement();

NodeList nodelist = order.getElementsByTagName("item");

list = new ArrayList<String>();

int i=0;

while(i < nodelist.getLength()){

Node node = nodelist.item(i);

Node list1 = node.getFirstChild();

XML1 = list1.getNodeValue();

list.add(XML1);

i++;

}

adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list);        

       setListAdapter(adapter);

}catch (UnsupportedEncodingException e){

}catch (ParserConfigurationException e){

}catch (SAXException e){

}catch (IOException e){

}

}

}

 

Comments