'PullParser'에 해당되는 글 1건

  1. 2009.06.14 [JavaFX] XML, JSON파싱하기 - PullParser와 HttpRequest를 이용 (2)
 
오픈API 등을 이용하려면 XML을 파싱해서 JavaFX로 가져와야 합니다.
HttpRequest를 이용해서 xml을 요청한 다음에 PullParser를 이용해 한줄한줄 파싱해서 데이터로 가져오는 방식을 사용합니다.

음...JavaFX가 1.2로 업데이트 되었는데요. 기존에 HttpRequest에서 요청할 때 enqueue()라는 함수로 실행을 했는데, start()로 함수명이 바뀌었네요. start()가 깔끔하군요.

간단하게 네이버OpenAPI를 파싱해보겠습니다.
실시간 급상승 검색어를 간단히 뿌려주는 소스입니다.
사용자 삽입 이미지

main.fx
[code]package xmlparser;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;

var rankingInfo:RankingInfo = RankingInfo{
    onDone: function() {
        var content:String = "";
        for (item in rankingInfo.ranking) {
            content += "{item}\n";
        }
        text.content = content;
    }
};

var text:Text = Text {
    font: Font {
        size: 16
    }
    x: 10
    y: 30
}

Stage {
    title: "Application title"
    width: 250
    height: 300
    scene: Scene {
        content: text
    }
}[/code]
RankingInfo.fx
[code]package xmlparser;

import javafx.data.pull.PullParser;
import javafx.io.http.HttpRequest;
import java.lang.Exception;

public class RankingInfo {
    var url:String = "http://openapi.naver.com/search?key=네이버OpenAPI키&target=rank&query=nexearch";
    var p:PullParser;
    var h:HttpRequest;
    public var ranking:String[];
    public var onDone:function() = null;
   
    init {
        ranking = [];
        h = HttpRequest {
            location: url
            onException: function(exception:Exception) {
                exception.printStackTrace();
            }
            onInput: function(input) {
                var i;
                p = PullParser {
                    documentType: PullParser.XML
                    input: input
                    onEvent: function(event) {
                        if (event.type == PullParser.START_DOCUMENT) {
                            ranking = [];
                            i = 0;
                        }
                        else if (event.type == PullParser.END_ELEMENT
                            and event.level == 3) {
                           if (event.qname.name == "K") {
                               println("{event.text}");
                               ranking[i] = event.text;
                               i++;
                           }
                        }
                        else if (event.type == PullParser.END_DOCUMENT) {
                            onDone();
                        }
                    }
                }
                p.parse();
                p.input.close();
            }
        }
        h.start();
    }
}
[/code]
PullParser와 HttpRequest를 이용합니다. HttpRequest를 이용해서 url을 지정해서 가져오면 onInput이 발생합니다. 여기에서 input을 PullParser에 지정을 해주면 한줄씩 읽을 때마다 onEvent가 발생하게 됩니다.
onEvent에서는 한줄씩 읽으면서 Parsing을 해주면 됩니다.
해당 엘리먼트를 가져오기위해선 문서의 레벨과 태그의 이름으로 알 수 있습니다.
[code]<result>
<item>
<R1>
<K>투시안경</K>
<S>+</S>
<V>105</V>
</R1>
</item>
</result>[/code]
위와 같은 xml이라면 <K>값을 가져오기 위해서는 K의 레벨과 K를 알면 됩니다. K레벨은 result를 0, item을 1, R1을 2, K는 3이 됩니다.
[code]if (event.type == PullParser.END_ELEMENT and event.level == 3) {
if (event.qname.name == "K") {
    println("{event.text}");
}[/code]
3이고, qname.name이 K인걸 찾으면 돼요. END_ELEMENT에서 해야하는 이유는 START_ELEMENT에서하면 값이 아직 파싱이 안된 상태여서 그렇습니다-_-

JSON인 경우도 비슷해요.
단지 Pullparser.START_ELEMENT나 END_ELEMENT가 아닌, END_VALUE로 파악을 하면 됩니다.
documentType: PullParser.JSON으로 바꿔주셔야 해요.
 
Posted by 머드초보

댓글을 달아 주세요

  1. 질문자 2011.01.17 16:01  댓글주소  수정/삭제  댓글쓰기

    현재 json 형태의 웹 페이지를 파싱중인데요.
    PullParser.JSON json 형태로 해봤는데
    저런 형태의 구문이 아닌거 같은데요..혹시 저런식으로 적용하신 적이 있으신지요?