«   2024/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

[팁] Android에서 SAX를 이용한 Parsing 방법 본문

Android/Tip&Tech

[팁] Android에서 SAX를 이용한 Parsing 방법

행복한 수지아빠 2011. 6. 20. 11:42


출처 : http://blog.naver.com/kippee?Redirect=Log&logNo=130058382142
일반적으로 Java에서 하는 방법과 동일하게 SAX 에서 제시하는 절차를 적용하면 된다

 



실제 Android에서 적용한 사례를 보면
해당 Site(http://www.google.com/base/feeds) 에 질의할 Query를 조립하고

  public ReviewFetcher(String loc, String description, String rat, int start, int numResults) {

        Log.v(Constants.LOGTAG, " " + ReviewFetcher.CLASSTAG + " location = " + loc + " rating = " + rat + " start = "
            + start + " numResults = " + numResults);

        this.start = start;
        this.numResults = numResults;
        String location = loc;  ⓐ  전의 GUI 에서 입력한 지역 (Location) 값
        String rating = rat;  ⓑ 전의 GUI에서 입력한 음식점 등급

        // urlencode params 물론 질의를 위하여 Encoding 필요
        try {
            if (location != null) {
                location = URLEncoder.encode(location, "UTF-8");
            }
            if (rating != null) {
                rating = URLEncoder.encode(rating, "UTF-8");
            }
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }

        // build query
        this.query = ReviewFetcher.QBASE;
        if ((rating != null) && !rating.equals("ALL")) {
            this.query += (ReviewFetcher.QR_PREFIX + rating + ReviewFetcher.QR_SUFFIX);
        }
        if ((location != null) && !location.equals("")) {
            this.query += (ReviewFetcher.QL_PREFIX + location + ReviewFetcher.QL_SUFFIX);
        }
        if ((description != null) && !description.equals("ANY")) {
            this.query += (ReviewFetcher.QD_PREFIX + description + ReviewFetcher.QD_SUFFIX);
        }
        this.query += (ReviewFetcher.QSTART_INDEX + this.start + ReviewFetcher.QMAX_RESULTS + this.numResults);

        Log.v(Constants.LOGTAG, " " + ReviewFetcher.CLASSTAG + " query - " + this.query);
    }



실제 Site에 질의하여 Parsing 한후 결과를 Array List에 집어 넣는 부분
 

  public ArrayList<Review> getReviews() {
        long startTime = System.currentTimeMillis();
        ArrayList<Review> results = null;

        try {
            URL url = new URL(this.query);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            ReviewHandler handler = new ReviewHandler(); ⓐ
            xr.setContentHandler(handler);

            xr.parse(new InputSource(url.openStream()));
            // after parsed, get record
            results = handler.getReviews();
        } catch (Exception e) {
            Log.e(Constants.LOGTAG, " " + ReviewFetcher.CLASSTAG, e);
        }
        long duration = System.currentTimeMillis() - startTime;
        Log.v(Constants.LOGTAG, " " + ReviewFetcher.CLASSTAG + " call and parse duration - " + duration);
        return results;
    }

}


그리고 실제 SAX 이벤트를 처리하는 Class

package com.msi.manning.restaurant.data;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

/**
 * SAX Handler impl for Google Base API and restaurant Review bean.
 *
 * @author charliecollins
 */
public class ReviewHandler extends DefaultHandler {

    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    private static final String ENTRY = "entry";

    private static final String R_AUTHOR = "review_author";

    private static final String R_CONTENT = "content";

    private static final String R_DATE = "review_date";

    private static final String R_IMAGE_LINK = "image_link";

    private static final String R_LINK = "link";

    private static final String R_LOCATION = "location";

    private static final String R_NAME = "name_of_item_reviewed";

    private static final String R_PHONE = "phone_of_item_reviewed";

    private static final String R_RATING = "rating";

    private boolean authorChars;
    private boolean contentChars;
    private boolean dateChars;
    private boolean imageLinkChars;
    private boolean locationChars;
    private boolean nameChars;
    private int numEntries;
    private boolean phoneChars;
    private boolean ratingChars;

생략


첨부문서는 Unblocking Android에 붙어있는 Code이다

☞ 2009.7.22 추가

첨부파일을 집에 와서 Import하여 새로운 Project를 만들려고 하는 데

Eclipse Console 창에 이런 메시지가 뜬다





[2009-07-22 21:32:03 - uad-RestaurantFinder] no classfiles specified

[2009-07-22 21:32:03 - uad-RestaurantFinder] Conversion to Dalvik format failed with error 1

 





 날보고 어찌 하라고.

하여튼 2시간에 걸쳐 삽질하다가 풀긴 풀었다.

해결하는 방법은 다음 블로그에...