본문 바로가기

Android

android with xpath

xml 파싱을 위해서 그 동안 SAX, DOM 등으로 element 를 한땀 한땀 찾아 내던걸 H/W 가 좋아지다 보니
이제 xpath로 쉽게 파싱을 할수 있는데 android 에서도 마찬가지로 xpath가 포함되어 있어 간단하게 나마 소개를 해보도록 한다.

먼저 파싱할 내용은 xml 이 아닌 html 이지만 어차피 동일한 구조? 이므로 html 을 쉽게 파싱하고자.. xpath 를 선택 했다.

XPATH 에 레퍼런스는 하단에 url을 참조 하면 되고..
http://developer.android.com/reference/javax/xml/xpath/package-summary.html


파싱할 데이터는 다음과 같다.. 이를 파싱하는 소스를 보면
[code]
<li>
    <div class="data_img">
        <a href="./view/249">
            <img src="/files/concert/1589.jpg" width="120" height="130"/>
        </a>
    </div>
    <div class="data_title">
        <a href="./view/249" class="font_title">
        허니서클
        </a>
    </div>
    <div class="data_date font_date">
        공연일시 : 2011/03/04 19:30 ~ 21:00
    </div>

    <div class="data_content font_content">
        허니서클은 스탠더드, 퓨전재즈, 컨템포러리 음악과 그루브 있는 사운드 연주로 유명한 팀입니다. 서울재즈 아카데미 강사진...
    </div>

    <div class="data_btn">
        <a href="./view/249"><img src="/views/concert/images/list_data_btn.gif" alt="" width="121" height="20" /></a>
    </div>
</li>
[/code]

실제 코드는 이렇다.

[code]
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
XPath xpath = XPathFactory.newInstance().newXPath();


concert = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + response.substring(ps, pe).trim();
//Log.d("@concert", concert);
//Log.d("imgURL", "================================================");

// html parsing
Document document = builder.parse(new ByteArrayInputStream(concert.getBytes()));

expression = "//div [@class='data_img']/a/img/@src";
image = ((String) xpath.evaluate(expression, document, XPathConstants.STRING)).trim();
Log.d("imgURL", image);
            

expression = "//div [@class='data_title']/a/text()";
xmlData[0] = ((String) xpath.evaluate(expression, document, XPathConstants.STRING)).trim();

expression = "//div [@class='data_date font_date']/text()";
xmlData[1] = ((String) xpath.evaluate(expression, document, XPathConstants.STRING)).trim();

expression = "//div [@class='data_content font_content']/text()";
xmlData[2] = ((String) xpath.evaluate(expression, document, XPathConstants.STRING)).trim();

expression = "//div [@class='data_btn']/a/img/@src";
xmlData[3] = ((String) xpath.evaluate(expression, document, XPathConstants.STRING)).trim();
[/code]


XPATH에 패턴을 설명 하자면 "/files/concert/1589.jpg" 에 정보를 얻기 위해서는 다음과 같이 패턴을 입력해 값을 얻을 수 있다.
[code]
"//div [@class='data_img']/a/img/@src"
[/code]

//div div 를 찾은 뒤
[@class='data_img'] class attribute 값이 data_img 인 녀석에
/a/img/ 하위 테그로 a 와 img 가 있고 Img 테그 내에
@src src attribute 에 값을 가져오는 것이다.

'Android' 카테고리의 다른 글

time  (0) 2013.10.08
webview ?  (0) 2013.10.08
String to InputStream  (0) 2013.10.08
How do I do a lazy load of images in ListView (DrawableManager)  (0) 2013.10.08
custom list view  (0) 2013.10.08