본문 바로가기
Mobile Programming/IOS(Swift)

[ios] 공공데이터를 이용하여 버스 어플리케이션 만들기1 - xml

by 푸고배 2019. 7. 8.

1. 공공데이터 오픈 API 신청하기 

1. 공공데이터 포털에 로그인하여 사용할 OpenAPI 검색하기

https://www.data.go.kr/

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

2. 활용신청버튼을 누르고 다음과 같은 화면으로 이동한다.

ios 어플리케이션을 개발할 것이기 때문에 활용 목적은 앱개발(모바일,솔루션등)을 선택하고 이용할 상세 기능정보를 골라서 선택하여 신청 버튼을 누른다.

 

3. [마이페이지]>[오픈API]>[개발계정 상세보기]에서 승인이 완료됐는지를 확인한다.

4. 오픈API를 사용할 수 있는지를 상세 기능정보 표의 오른쪽 실행 버튼을 이용해 알아본다.

ServiceKey에는 1-3의 키 값을 붙여넣기하고 미리보기를 누르면 다음과 같은 xml화면이 나타난다.

 

오픈 API 신청후 10~30분 정도 기다려야 한다. 바로 접근하면 에러가 발생했다.

 

2. 프로젝트 생성하기

1. xcode로 새로운 프로젝트를 생성한다.

2. 버스 정보를 받아올 페이지에 다음과 같이 XMlParserDelegate 상속을 추가한다.

(예시에서는 프로젝트 생성 시 기본으로 생기는 ViewController.swift에 정보를 받아온다.) 

import UIKit

class ViewController: UIViewController, XMLParserDelegate {
	...
}

3. viewDidLoad나 viewWillAppear에 다음과 같은 코드를 추가한다.

let key = "[공공데이터포털에서 얻어온 개인의 키]"
let url = "[API URL]&serviceKey=\(key)"
//let url = http://61.43.246.153/openapi-data/service/busanBIMS2/stopArr?bstopid=193990101&serviceKey=\(key)
        
let xmlParser = XMLParser(contentsOf: URL(string: url)!)
xmlParser!.delegate = self
xmlParser!.parse()

key의 값은 1-3의 키 값을 복사해서 붙여 넣으면 된다.

정확한 url값을 알기위해서는 우선 1-3의 참고 문서를 다운로드한다.

다운로드한 문서를 열어보면 다음과 같이 응답 메시지의 예제가 들어있는데 이 URL을 복사해서 쓰면 된다.

serviceKey는 주석 처리한 코드와 같이 위에서 선언한 key 값을 이용한다.

만약 위와 같이 주소가 http://라면 Info.plist를 우클릭하여 [Open As]>[Source Code]로 연다.

그다음 <dict> 태그 안에 다음과 같은 소스코드를 추가하여 보안설정을 마친다.

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

4. 다음과 같은 parser 함수를 선언한다. (2-2시 에러코드를 클릭해서 자동으로 구현, 또는 직접 입력)

// XML 파서가 시작 테그를 만나면 호출됨
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        
}

// 현재 테그에 담겨있는 문자열 전달
func parser(_ parser: XMLParser, foundCharacters string: String) {
        
}

// XML 파서가 종료 테그를 만나면 호출됨
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
      
}
    

5. 2-4의 첫 번째 함수는 파서가 시작 태그를 만나면 호출된다. 따라서 값을 옮겨 담을 배열을 초기화하거나 두 번째 함수에서 태그를 구분하여한다면 태그의 이름을 담는 변수에 값을 저장한다.

var currentElement="" // 태그를 저장할 문자열
var b:클래스() // 파싱을 통해 얻은 정보를 저장할 클래스(임의로 생성해줌)
var busInfoArr = Array<클래스>() // 값이 여러 개일 경우 클래스를 저장할 배열
...
currentElement = elementName
if(elementName=="item"){
	b = 클래스()
}

6. 2-4의 두번째 함수는 현재 태그에 담겨있는 문자열을 얻을 수 있다. 따라서 태그 안의 실질적인 데이터에 접근하여 프로젝트의 객체나 변수에 옮겨 담는 과정을 진행한다.

switch currentElement {
    case "bstopIdx":
        b.bstopIdx = string
    case "nodeNm":
        b.nodeNm = string
    default:
       break;
}

currentElement는 2-6에서 저장한 태그의 값이고 string은 태그 안의 실질적인 데이터 값이다.

7, 2-4의 세 번째 함수는 파서가 종료 태그를 만나면 실행된다.

 if(elementName=="item"){
 	busInfoArr.append(b)
 }

가장 바깥 태그인  item을 만날 경우 앞에서 만들었던 클래스를 2-5에서 만든 배열에 집어넣는다.

 

2-4의 두 번째 함수에 print(string)을 해보면 다음과 같은 값을 얻을 수 있다.

파싱을 통해 얻은 값으로 본격적인 어플을 개발하여 보자

반응형

댓글