마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[안드로이드스튜디오]openAPI xml파싱과 TableLayout 동적으로 생성

0 추천

TableLayout과 Parsing을 같이 하려니 소스가 꼬여서 질문드립니다.

 

<TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#999999"
            android:stretchColumns="*">
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp" />
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="자료명"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="저자"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="출판사"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="소장처명"/>
            </TableRow>
        </TableLayout>

화면구성은 현재 이렇게 되어있는 상태입니다.

Spinner는 안에 item 집어넣기 전이라 저렇게 나왔는데, (자료명, 저자, 출판사) 이렇게 선택 가능합니다.

자료명 선택하고 EditText에 텍스트를 입력해서 검색을 누르면 해당하는 자료명의 정보를 검색하고 싶어요.

openAPI는 서울 공공데이터 이용했습니다.

http://data.seoul.go.kr/openinf/openapiview.jsp?infId=OA-2239&tMenu=11

여기 참고하시면 됩니다.

 

화면 자체는 Navigation Drawer를 이용하느라 extends Fragment(프래그먼트 사용)한 상태입니다.

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        getActivity().setTitle("소장자료 현황");

        View view = inflater.inflate(R.layout.have_fragment, container, false);
        spin = (Spinner) view.findViewById(R.id.spinner);
        String data[] = {"자료명", "저자", "출판사"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, data);
        spin.setAdapter(adapter);

        assert view != null;

        return view;
    }

    public void clickSearch(View v) {
        String selData = spin.getSelectedItem().toString();

        editText = (EditText) getView().findViewById(R.id.editText);
        String str_text = editText.getText().toString();

        String serviceKey = "인증키부분입니다.";
        String serviceUrl = "http://openAPI.seoul.go.kr:8088/";
        String strUrl = serviceUrl + serviceKey + "/xml/SeoulLibraryBookSearch/1/5/%20/";

        String title = "";
        String author = "";
        String publer = "";

        if (selData == "자료명") {
            strUrl = strUrl + str_text;
        }

        if (selData == "저자") {
            strUrl = strUrl + "%20/" + str_text;
        }

        if (selData == "출판사") {
            strUrl = strUrl + "%20/%20/" + str_text;
        }

        new DownloadWeb().execute(strUrl);
    }

    public class DownloadWeb extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            try {
                return (String)downloadUrl((String)params[0]);
            } catch (IOException e) {
                return "다운로드 실패";
            }
        }

        @Override
        protected void onPostExecute (String result) {
            try {
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                xpp.setInput(new StringReader(result));
                int eventType = xpp.getEventType();
                boolean bSet = false;

                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_DOCUMENT) {
                        ;
                    } else if(eventType == XmlPullParser.START_TAG) {
                        String tag_name = xpp.getName();
                        if (tag_name.equals("TITLE") || tag_name.equals("AUTHOR") || tag_name.equals("PUBLER") || tag_name.equals("LOCA_NAME"))
                            bSet = true;
                    } else if (eventType == XmlPullParser.TEXT) {
                        if (bSet) {
                            String content = xpp.getText();
                            tv.append(content + "\n");
                            bSet = false;
                        }
                    } else if(eventType == XmlPullParser.END_TAG) {
                        ;
                    }
                    eventType = xpp.next();
                }
            } catch (Exception e) {
                tv.setText(e.getMessage());
            }
        }
    }

    private String downloadUrl(String myurl) throws  IOException {
        HttpURLConnection conn = null;
        try {
            URL url = new URL(myurl);
            conn = (HttpURLConnection) url.openConnection();
            BufferedInputStream buf = new BufferedInputStream(conn.getInputStream());
            BufferedReader bufreader = new BufferedReader(new InputStreamReader(buf, "utf-8"));
            String line = null;
            String page = "";

            while ((line = bufreader.readLine()) != null) {
                page += line;
            }
            return page;
        } finally {
            conn.disconnect();
        }
    }

소스가 이런 식인데, 예전에 parsing 간단한 예제 만들면서 사용했던 소스랑 짜집기한거구요..

이걸 고쳐야 하는데 보시다시피 TableRow 동적 생성 부분은 못 한 상태입니다.

tv는 원래 전에 예제하면서 썼던 textview인데, 저 부분을 TableRow 생성하는 부분으로 바꿔야 합니다.

 

그러니까 정확히 제가 구현하고 싶은 게 뭐나면,

ex) Spinner - '자료명' 선택, EditText - '빗방울처럼 나는 혼자였다' -> 검색 버튼 클릭

-> 자료명이 '빗방울처럼 나는 혼자였다'에 대한 자료명, 저자, 출판사, 소장처명이 Table로 표시됨.

 

이렇게 구현하고 싶어요. 그래서 if 조건문으로 Spinner에서 선택한 값을 받아와서 그것에 따른 결과를 표시하고 싶은데..

소스를 어떻게 고쳐야 할지 모르겠습니다. 도와주세요..ㅠㅠ

진여울 (300 포인트) 님이 2016년 12월 18일 질문
자바소스 수정했습니다. 이걸 어케 잘 정렬하고 싶어요.. Parsing되는 건 확인했는데, 예쁘게 정렬해서 띄우고 싶은데.. Table까진 아니어도 비슷한 형태로요.
이게 지금 전부 세로로 한줄씩 나오고 있거든요..

=====================================================

package com.example.a315.libraryexample1125;

import android.os.AsyncTask;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;

import org.w3c.dom.Text;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class HaveFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    Spinner spin;
    EditText editText;
    Button btn_search;
    TextView tv;

    public HaveFragment() {

    }

    public static HaveFragment newInstance(String param1, String param2) {
        HaveFragment fragment = new HaveFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        getActivity().setTitle("소장자료 현황");

        View view = inflater.inflate(R.layout.have_fragment, container, false);
        spin = (Spinner) view.findViewById(R.id.spinner);
        String data[] = {"자료명", "저자", "출판사"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, data);
        spin.setAdapter(adapter);

        btn_search = (Button)view.findViewById(R.id.btn_search);

        tv = (TextView) view.findViewById(R.id.textView);

        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String selData = spin.getSelectedItem().toString();

                editText = (EditText) getView().findViewById(R.id.editText);
                String str_text = editText.getText().toString();

                String serviceKey = "인증키";
                String serviceUrl = "http://openAPI.seoul.go.kr:8088/";
                String strUrl = serviceUrl + serviceKey + "/xml/SeoulLibraryBookSearch/1/5/%20/";

                String title = "";
                String author = "";
                String publer = "";

                if (selData == "자료명") {
                    strUrl = strUrl + str_text;
                    new DownloadWeb().execute(strUrl);
                }

                if (selData == "저자") {
                    strUrl = strUrl + "%20/" + str_text;
                    new DownloadWeb().execute(strUrl);
                }

                if (selData == "출판사") {
                    strUrl = strUrl + "%20/%20/" + str_text;
                    new DownloadWeb().execute(strUrl);
                }
            }
        });
        //assert view != null;

        return view;
    }

    public class DownloadWeb extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            try {
                return (String)downloadUrl((String)params[0]);
            } catch (IOException e) {
                return "다운로드 실패";
            }
        }

        @Override
        protected void onPostExecute (String result) {
            try {
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                xpp.setInput(new StringReader(result));
                int eventType = xpp.getEventType();
                boolean bSet = false;

                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if (eventType == XmlPullParser.START_DOCUMENT) {
                        ;
                    } else if(eventType == XmlPullParser.START_TAG) {
                        String tag_name = xpp.getName();
                        if (tag_name.equals("TITLE") || tag_name.equals("AUTHOR") || tag_name.equals("PUBLER") || tag_name.equals("LOCA_NAME"))
                            bSet = true;
                    } else if (eventType == XmlPullParser.TEXT) {
                        if (bSet) {
                            String content = xpp.getText();
                            tv.append(content + "\n");
                            bSet = false;
                        }
                    } else if(eventType == XmlPullParser.END_TAG) {
                        ;
                    }
                    eventType = xpp.next();
                }
            } catch (Exception e) {
                tv.setText(e.getMessage());
            }
        }
    }

    private String downloadUrl(String strUrl) throws  IOException {
        HttpURLConnection conn = null;
        try {
            URL url = new URL(strUrl);
            conn = (HttpURLConnection) url.openConnection();
            BufferedInputStream buf = new BufferedInputStream(conn.getInputStream());
            BufferedReader bufreader = new BufferedReader(new InputStreamReader(buf, "utf-8"));
            String line = null;
            String page = "";

            while ((line = bufreader.readLine()) != null) {
                page += line;
            }
            return page;
        } finally {
            conn.disconnect();
        }
    }
}
xml은 이렇습니다.

===========================

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.a315.libraryexample1125.HaveFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinner" />

        <EditText
            android:layout_width="150sp"
            android:layout_height="wrap_content"
            android:id="@+id/editText"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="검색"
            android:id="@+id/btn_search" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#999999"
            android:stretchColumns="*"
            android:id="@+id/tableLayout">
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp" />
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tableRow">
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="자료명"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="저자"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="출판사"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:background="#666666"
                    android:padding="3dp"
                    android:layout_marginBottom="1dp"
                    android:layout_marginLeft="1dp"
                    android:text="소장처명"/>
            </TableRow>
        </TableLayout>
    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/textView"/>
    </ScrollView>
</LinearLayout>

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...