본문 바로가기
안드로이드/네트워크

안드로이드 xml 문서 사용

by 김어찐 2022. 6. 26.
728x90

xml 문서

Extensible Markup Language
W3c에서 개발된 마크업 언어
데이터를 태그라는 것으로 묶어 관리하는 기법이다.

 

xml 문서 파싱

문서를 분석하는 것을 Parsing 이라고 부른다.
XML 문서 파싱에는 여러 방법들이 제공되나 여기에서는 비교적 간단한 DOM 방식을 사용한다.
XML 문서에서 추출한 모든 데이터는 문자열이므로 적당한 타입으로 변환하여 사용해야 한다.

 

package com.example.httpxml

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import org.w3c.dom.Element
import java.net.HttpURLConnection
import java.net.URL
import javax.xml.parsers.DocumentBuilderFactory
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            thread {
                val site ="http://192.168.0.128:8080/xml.jsp"
                val url = URL(site)
                val conn  = url.openConnection() as HttpURLConnection

                // DOM 방식으로 XML 문서를 분삭할 수 있는 객체를 생성한다.
                val factory = DocumentBuilderFactory.newInstance()
                val builder = factory.newDocumentBuilder()
                val doc = builder.parse(conn.inputStream)

                // 최상위 태그를 얻어온다.
                val root = doc.documentElement
                // item 태그들을 가져온다
                val item_list = root.getElementsByTagName("item")

                runOnUiThread{
                    textView.text=""
                }

                // item 태그의 수 만큼 반복
                for(i in 0 until item_list.length){
                    // i 번째 item 태그 객체를 추출한다.
                    val item_tag = item_list.item(i) as Element

                    // item 태그 안의 태그들을 언더온다.
                    val data1_list = item_tag.getElementsByTagName("data1")
                    val data2_list = item_tag.getElementsByTagName("data2")
                    val data3_list = item_tag.getElementsByTagName("data3")

                    // 0 번째 태그를 가져온다다
                    val data1_tag = data1_list.item(0) as Element
                    val data2_tag = data2_list.item(0) as Element
                    val data3_tag = data3_list.item(0) as Element

                    val data1 = data1_tag.textContent
                    val data2 = data1_tag.textContent
                    val data3 = data1_tag.textContent

                    val a2 = data2.toInt()
                    val a3 = data3.toDouble()

                    runOnUiThread {
                        textView.append("data1 : $data1\n")
                        textView.append("a2 : $a2\n")
                        textView.append("a3 : $a3\n")

                    }
                }
           }
        }
    }
}

 

 

퍼미션 및 http 권한 허용

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.httpxml">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.HttpXML"
        tools:targetApi="31"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

 

xml 문서 정보

<data>
	<item>
		<data1>문자열1</data1>
		<data2>100</data2>
		<data3>11.11</data3>
	</item>
	<item>
		<data1>문자열2</data1>
		<data2>200</data2>
		<data3>22.22</data3>
	</item>
	<item>
		<data1>문자열3</data1>
		<data2>300</data2>
		<data3>33.33</data3>
	</item>
	<item>
		<data1>문자열4</data1>
		<data2>400</data2>
		<data3>44.44</data3>
	</item>
	<item>
		<data1>문자열5</data1>
		<data2>500</data2>
		<data3>55.55</data3>
	</item>
	<item>
		<data1>문자열6</data1>
		<data2>600</data2>
		<data3>66.66</data3>
	</item>
</data>
728x90

'안드로이드 > 네트워크' 카테고리의 다른 글

안드로이드 json 사용하기  (0) 2022.06.26
안드로이드 서버 미디어 가져오기  (0) 2022.06.26