안드로이드 XML 파서 사용하기. (Using an Android XML Parser)

2017. 7. 4. 17:11


1. XmlPullParser (org.xmlpull.v1.XmlPullParser)

이전 글 [안드로이드 XML 파서]에서 XML의 개요와 특징을 간단히 설명하고, XML 파서의 유형에 대해 살펴보았습니다. 그리고 안드로이드에서 사용할 수 있는 XML 파서인 XmlPullParser에 대해 설명하고, 간단한 XML 코드를 예로 들어 XML 데이터가 XmlPullParser를 통해 파싱되는 과정에 대해 알아보았습니다.


안드로이드에서, XmlPullParser를 사용한 XML 파싱 과정이 어떻게 수행되는지 어느 정도 파악되었으리라 생각되니, 이제 실제 앱을 만드는 과정을 통해, XML 데이터를 파싱하고, 파싱한 데이터를 화면에 표시하는 방법에 대해 설명하도록 하겠습니다.

1.1 안드로이드 애셋(Asset)에 저장된 XML 파일.

예제에서 사용하는 XML 파일은 안드로이드 애셋(Asset)을 통해 제공됩니다. 안드로이드 애셋(Asset)은, 미리 만들어놓은 파일을 앱 빌드 시 APK에 포함시켜, 앱이 실행된 후 접근하여 읽을 수 있도록 만드는 방법입니다.


안드로이드 애셋(Asset) 폴더에 추가한 파일을 앱에서 열 때는 AssetManager 클래스를 사용합니다. 앱에서 AssetManager를 초기화하는 방법은 Context의 getResource() 함수를 통해 Resources 클래스 객체의 참조를 획득한 다음, Resources의 getAssets() 함수를 호출하는 것입니다. 그리고 AssetManager의 open() 함수를 사용하여 열고자 하는 파일의 스트림을 열 수 있습니다.

    AssetManager am = getResource().getAssets() ;
    InputStream fis = null ;

    try {
        fis = am.open("FILE") ;

        // TODO : use fis.
    } catch (Exception e) {
        e.printStackTrace() ;
    }

안드로이드 애셋(Asset)에 대한 자세한 사용법은 [안드로이드 애셋(Asset) 사용하기]의 내용을 통해 확인할 수 있습니다.

2. 안드로이드에서 XML 파일 파싱하기.

XML 파일 파싱하기 예제는 아래와 같은 레이아웃으로 구성됩니다.

안드로이드 XML 파서 예제 레이아웃


2.1 애셋(Asset) 폴더에 XML 파일 추가하기.

가장 먼저 할 일은 앱에서 읽을 XML 파일을 애셋(Asset) 폴더에 추가하는 것입니다. 애셋(Asset) 폴더를 추가하는 방법은 [안드로이드 애셋(Asset) 사용하기]에서 확인할 수 있으며, 아래 그림은 애셋(Asset) 폴더에 XML 파일을 추가한 화면입니다.

[STEP-1] "src/main/assets/" - 안드로이드 애셋(Asset) 폴더 추가하기.

안드로이드 XML 파서 사용 예제 XML 파일 추가


예제에서 사용하는 XML 파일의 내용은 아래와 같습니다.

[STEP-2] "src/main/assets/contact.xml" - XML 파일 내용.
<?xml version="1.0" encoding="utf-8"?>
<CONTACT>
    <NO>1</NO>
    <NAME>ppotta</NAME>
    <PHONE>010-8888-9999</PHONE>
    <OVER20>true</OVER20>
</CONTACT>

2.2 MainActivity 레이아웃 작성하기.

예제 앱 화면 구성도에 따라 MainActivity에 표시될 레아아웃 XML 코드를 작성합니다.

[STEP-3] "activity_main.xml" - MainActivity의 레이아웃 XML 코드 작성.
    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:stretchColumns="1">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="No" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextNo"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Name" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextName"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Phone" />

            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/editTextPhone"/>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="24sp"
                android:text="Over20" />

            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:textSize="24sp"
                android:id="@+id/checkBoxOver20"
                android:text="Over 20 years?"/>
        </TableRow>

    </TableLayout>

2.3 애셋(Asset)에 포함된 XML 파일 읽어서 표시하기

이제 애셋(Asset) 폴더에 저장된 "contact.xml" 파일에서 XML 데이터를 파싱한 다음, 화면에 표시하는 코드를 작성합니다.

[STEP-4] "MainActivity.java" - 애셋(Asset) 폴더의 "contact.xml" 파일 내용 표시.
public class MainActivity extends AppCompatActivity {

    final int STEP_NONE = 0 ;
    final int STEP_NO = 1 ;
    final int STEP_NAME = 2 ;
    final int STEP_PHONE = 3 ;
    final int STEP_OVER20 = 4 ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... 코드 계속

        // AssetManager 객체 참조 획득.
        AssetManager am = getResources().getAssets() ;
        InputStream is = null ;

        try {
            int no = -1 ;
            String name = null ;
            String phone = null ;
            boolean isOver20 = false ;

            // XML 파일 스트림 열기
            is = am.open("contact.xml") ;

            // XML 파서 초기화
            XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = parserFactory.newPullParser() ;

            // XML 파서에 파일 스트림 지정.
            parser.setInput(is, "UTF-8") ;

            int eventType = parser.getEventType() ;
            int step = STEP_NONE ;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    // XML 데이터 시작
                } else if (eventType == XmlPullParser.START_TAG) {
                    String startTag = parser.getName() ;
                    if (startTag.equals("NO")) {
                        step = STEP_NO ;
                    } else if (startTag.equals("NAME")) {
                        step = STEP_NAME ;
                    } else if (startTag.equals("PHONE")) {
                        step = STEP_PHONE ;
                    } else if (startTag.equals("OVER20")) {
                        step = STEP_OVER20 ;
                    } else {
                        step = STEP_NONE ;
                    }
                } else if (eventType == XmlPullParser.END_TAG) {
                    String endTag = parser.getName() ;
                    if ((endTag.equals("NO") && step != STEP_NO) ||
                            (endTag.equals("NAME") && step != STEP_NAME) ||
                            (endTag.equals("PHONE") && step != STEP_PHONE) ||
                            (endTag.equals("OVER20") && step != STEP_OVER20))
                    {
                        // TODO : error
                    }
                    step = STEP_NONE ;
                } else if (eventType == XmlPullParser.TEXT) {
                    String text = parser.getText() ;
                    if (step == STEP_NO) {
                        try {
                            no = Integer.parseInt(text);
                        } catch (Exception e) {
                            no = 0 ;
                        }
                    } else if (step == STEP_NAME) {
                        name = text ;
                    } else if (step == STEP_PHONE) {
                        phone = text ;
                    } else if (step == STEP_OVER20) {
                        isOver20 = Boolean.parseBoolean(text);
                    }
                }

                eventType = parser.next();
            }

            if (no == -1 || name == null || phone == null) {
                // ERROR : XML is invalid.
            } else {

                EditText editTextNo = (EditText) findViewById(R.id.editTextNo);
                editTextNo.setText(Integer.toString(no));

                EditText editTextName = (EditText) findViewById(R.id.editTextName);
                editTextName.setText(name);

                EditText editTextPhone = (EditText) findViewById(R.id.editTextPhone);
                editTextPhone.setText(phone);

                CheckBox checkBoxOver20 = (CheckBox) findViewById(R.id.checkBoxOver20);
                checkBoxOver20.setChecked(isOver20) ;
            }
        } catch (Exception e) {
            e.printStackTrace() ;
        }
    }
}

3. 예제 실행 화면.

예제를 실행하면 아래 그림과 같이 "contact.xml" 파일의 내용이 화면에 표시된 것을 확인할 수 있습니다.

안드로이드 XML 파서 사용 예제 실행 화면


4. 참고.

.END.


'ANDROID 프로그래밍 > XML' 카테고리의 다른 글

안드로이드 XML 파서. (Android XML Parser)  (2) 2017.06.21

ANDROID 프로그래밍/XML