반응형

 네이버에서 제공하는 오픈 API 를 파싱해서 단순하게 텍스트뷰(TextView)에 출력하는 소스 코드입니다.


XmlPullParser 를 이용한 파싱 입니다. 


네이버 검색 오픈 API중에 '지역' 검색을 하는 예제 소스입니다. 

네이버 개발자센터에서 검색키를 발급받으셔야 합니다. 검색키 발급방법은 다른 포스트를 참고하시기 바랍니다.

 



메인화면                                                                   검색값 입력(스타벅스)  

                




네이버 XML data 문자열로 출력 ( Scrolling 가능 )

               





Layout 파일

 activity_main.xml

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

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:padding="10dp">

    

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="50dp"

        android:orientation="horizontal"

        android:weightSum="10">

        

        <EditText android:id="@+id/edit"

        android:layout_width="0dp"

        android:layout_height="match_parent"

        android:layout_weight="8"

        android:textSize="12sp"

        android:hint="enter text to search"/>

    

    <Button android:id="@+id/button"

        android:layout_width="0dp"

        android:layout_height="match_parent"

        android:layout_weight="2"

        android:text="search"

        android:textSize="12sp"

        android:onClick="mOnClick"/>

        

    </LinearLayout>    

    

    <ScrollView 

        android:layout_width="match_parent"

        android:layout_height="match_parent">

    

        <TextView android:id="@+id/text"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:textSize="8sp"        

        android:textStyle="bold"/>

        

    </ScrollView>     


</LinearLayout>






소스파일

 

 MainActivity.java

public class MainActivity extends Activity {

EditText edit;

TextView text;

XmlPullParser xpp;

String key=" 본인의 개발자 검색 키 "//Naver 개발자센터 검색 키

String data;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

edit= (EditText)findViewById(R.id.edit);

text= (TextView)findViewById(R.id.text);

}

//Button을 클릭했을 때 자동으로 호출되는 callback method....

public void mOnClick(View v){

switch( v.getId() ){

case R.id.button:

//Android 4.0 이상 부터는 네트워크를 이용할 때 반드시 Thread 사용해야 함

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

data= getXmlData(); //아래 메소드를 호출하여 XML data를 파싱해서 String 객체로 얻어오기

//UI Thread(Main Thread)를 제외한 어떤 Thread도 화면을 변경할 수 없기때문에

//runOnUiThread()를 이용하여 UI Thread가 TextView 글씨 변경하도록 함

runOnUiThread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

text.setText(data);  //TextView에 문자열  data 출력

}

});

}

}).start();

break;

}

}//mOnClick method..

//XmlPullParser를 이용하여 Naver 에서 제공하는 OpenAPI XML 파일 파싱하기(parsing)

String getXmlData(){

StringBuffer buffer=new StringBuffer();

String str= edit.getText().toString(); //EditText에 작성된 Text얻어오기

String location = URLEncoder.encode(str); //한글의 경우 인식이 안되기에 utf-8 방식으로 encoding..

String queryUrl="http://openapi.naver.com/search"   //요청 URL

   +"?key="+key                        //key 값

   +"&target=local"                     //검색서비스 api명세

   +"&query="+location                 //지역검색 요청값

   +"&display=10"                      //검색 출력 건수  10~100

   +"&start=1";                         //검색 시작 위치  1~1000

try {

URL url= new URL(queryUrl); //문자열로 된 요청 url을 URL 객체로 생성.

InputStream is= url.openStream();  //url위치로 입력스트림 연결

XmlPullParserFactory factory= XmlPullParserFactory.newInstance();

XmlPullParser xpp= factory.newPullParser();

xpp.setInput( new InputStreamReader(is, "UTF-8") );  //inputstream 으로부터 xml 입력받기

String tag;

xpp.next();

int eventType= xpp.getEventType();

while( eventType != XmlPullParser.END_DOCUMENT ){

switch( eventType ){

case XmlPullParser.START_DOCUMENT:

buffer.append("start NAVER XML parsing...\n\n");

break;

case XmlPullParser.START_TAG:

tag= xpp.getName();    //테그 이름 얻어오기

if(tag.equals("item")) ;// 첫번째 검색결과

else if(tag.equals("title")){

buffer.append("업소명 : ");

xpp.next();

buffer.append(xpp.getText()); //title 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

else if(tag.equals("category")){

buffer.append("업종 : ");

xpp.next();

buffer.append(xpp.getText()); //category 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

else if(tag.equals("description")){

buffer.append("세부설명 :");

xpp.next();

buffer.append(xpp.getText()); //description 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

else if(tag.equals("telephone")){

buffer.append("연락처 :");

xpp.next();

buffer.append(xpp.getText()); //telephone 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

else if(tag.equals("address")){

buffer.append("주소 :");

xpp.next();

buffer.append(xpp.getText()); //address 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

else if(tag.equals("mapx")){

buffer.append("지도 위치 X :");

xpp.next();

buffer.append(xpp.getText()); //mapx 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("  ,  ");          //줄바꿈 문자 추가

}

else if(tag.equals("mapy")){

buffer.append("지도 위치 Y :");

xpp.next();

buffer.append(xpp.getText()); //mapy 요소의 TEXT 읽어와서 문자열버퍼에 추가 

buffer.append("\n");          //줄바꿈 문자 추가

}

break;

case XmlPullParser.TEXT:

break;

case XmlPullParser.END_TAG:

tag= xpp.getName();    //테그 이름 얻어오기

if(tag.equals("item")) buffer.append("\n"); // 첫번째 검색결과종료..줄바꿈

break;

}

eventType= xpp.next();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

buffer.append("end NAVER XML parsing...\n");

return buffer.toString(); //StringBuffer 문자열 객체 반환

}//getXmlData method....

}//MainActivity class..

  



 네트워크 사용하기 위해서는 사용 권한(uses-permission)이 필요합니다.

여러분 프로젝트의 메니페스트 파일에 퍼미션을 추가합니다.


 AndroidManifest.xml

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

    package="com.kitesoft.xmlpullparsernaver"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19"/>


    <!-- 네트워크 사용허가 요청  -->

    <uses-permission android:name="android.permission.INTERNET"/>


    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>


</manifest>


 

반응형

+ Recent posts