개발을 시작하는 이야기

04. XMLParser 01 본문

개발 이야기/우리동네 문화유산 :: JHeritage

04. XMLParser 01

Teiresias 2022. 3. 7. 18:40

개인적으로 이번 프로젝트를 진행하면서 가장 큰 복병이였다.

 

TrandMedia 프로젝트에서 이미 JSON 데이터를 다뤄보았으니 XML도 별반 다를바 없을거라 생각했었다.

하지만 그당시의 내 실력은 너무도 작고 귀엽고 하찮았기에 XML을 두고 한 삽질은 오래도 걸렸다.

일단 JSON과 XML의 가장 큰 차이점은 불러오는 데이터의 방식이 확연히 다르다

 

XML은 'eXtensible Markup Language'의 약자로 HTML과 매우 비슷한 문자 양식을 갖고 있다.

시작과 종료에 태그를 사용하고 <> 꺽쇠 괄호를 사용해서 데이터를 감싸기 때문에 Swift에서 데이터를 사용하기 위해서는 앞뒤의 꺽쇠 괄호를 처리해주어야 한다. 이걸 Parsing이라고 하고, Parsing을 하는 processor가 Parser라고 한다.

프로그램을 컴파일 하는 과정에서 특정 프로그래밍 언어가 제시하는 문법을 잘 지켜서 작성되어 있다면 문서를 읽고 태그명, 속성명, 속성값 및 엘리먼트 내용을 분리해주는 방식이다.

 

Swift의 XMLParser는 XMLParserDelegate를 통해서 진행되었다.

XML 예시

<?xml version="1.0" encoding="utf-8"?>
<result>
	<totalCnt>16419</totalCnt>
	<pageUnit>1</pageUnit>
	<pageIndex>1</pageIndex>
	<item>
		<sn>1</sn>
		<no>1</no>
		<ccmaName>
			<![CDATA[국보]]>
		</ccmaName>
		<crltsnoNm>1</crltsnoNm>
		<ccbaMnm1>
			<![CDATA[서울 숭례문]]>
		</ccbaMnm1>
		<ccbaMnm2>
			<![CDATA[서울 崇禮門]]>
		</ccbaMnm2>
		<ccbaCtcdNm>
			<![CDATA[서울]]>
		</ccbaCtcdNm>
		<ccsiName>
			<![CDATA[중구]]>
		</ccsiName>
		<ccbaAdmin>
			<![CDATA[문화재청 덕수궁관리소]]>
		</ccbaAdmin>
		<ccbaKdcd>11</ccbaKdcd>
		<ccbaCtcd>11</ccbaCtcd>
		<ccbaAsno>00010000</ccbaAsno>
		<ccbaCncl>N</ccbaCncl>
		<ccbaCpno>1111100010000</ccbaCpno>
		<longitude>126.975312652739</longitude>
		<latitude>37.559975221378</latitude>
	</item>
</result>

반면에 JSON의 경우

 

비교적 최신에 나온 형식으로 알고 있는데, XML보다 비교적으로 사용하기 쉽고, 적은 메모리를 사용하며, 맵핑을 생성하지 않아도 되기 때문에  최근 기업에서 제공하는 대부분의 OPEN API의 경우 JSON 방식을 채택하고 있는 반면, XML 같은 경우는 비교적 오래된 관공서에서 제공되는 공공API 들이 주로 사용하고 있다고 한다.

 

JSON 예시

{
	"adult": false,
	"backdrop_path": "/vIgyYkXkg6NC2whRbYjBD7eb3Er.jpg",
	"belongs_to_collection": {
		"id": 558216,
		"name": "Venom Collection",
		"poster_path": "/670x9sf0Ru8y6ezBggmYudx61yB.jpg",
		"backdrop_path": "/rhLspFB1B8ZCkWEHFYmc3NKagzq.jpg"
	},
	"budget": 110000000,
	"genres": [
		{
			"id": 878,
			"name": "Science Fiction"
		},
		{
			"id": 28,
			"name": "Action"
		},
		{
			"id": 12,
			"name": "Adventure"
		}
	],
	"homepage": "<https://www.venom.movie>",
	"id": 580489,
	"imdb_id": "tt7097896",
	"original_language": "en",
	"original_title": "Venom: Let There Be Carnage",
	"overview": "After finding a host body in investigative reporter Eddie Brock, the alien symbiote must face a new enemy, Carnage, the alter ego of serial killer Cletus Kasady.",
	"popularity": 1067.665,
	"poster_path": "/rjkmN1dniUHVYAtwuV3Tji7FsDO.jpg",
	"production_companies": [
		{
			"id": 7505,
			"logo_path": "/837VMM4wOkODc1idNxGT0KQJlej.png",
			"name": "Marvel Entertainment",
			"origin_country": "US"
		},
		{
			"id": 5,
			"logo_path": "/71BqEFAF4V3qjjMPCpLuyJFB9A.png",
			"name": "Columbia Pictures",
			"origin_country": "US"
		},
		{
			"id": 84041,
			"logo_path": "/nw4kyc29QRpNtFbdsBHkRSFavvt.png",
			"name": "Pascal Pictures",
			"origin_country": "US"
		},
		{
			"id": 53462,
			"logo_path": null,
			"name": "Matt Tolmach Productions",
			"origin_country": "US"
		},
		{
			"id": 166230,
			"logo_path": null,
			"name": "Avi Arad Productions",
			"origin_country": "US"
		}
	],
	"production_countries": [
		{
			"iso_3166_1": "US",
			"name": "United States of America"
		}
	],
	"release_date": "2021-09-30",
	"revenue": 500000000,
	"runtime": 97,
	"spoken_languages": [
		{
			"english_name": "Spanish",
			"iso_639_1": "es",
			"name": "Español"
		},
		{
			"english_name": "English",
			"iso_639_1": "en",
			"name": "English"
		}
	],
	"status": "Released",
	"tagline": "",
	"title": "Venom: Let There Be Carnage",
	"video": false,
	"vote_average": 7.1,
	"vote_count": 6469
}

XMLParser에 대해 알아보며 참고했던 자료들

 

Apple Developer Documentation

 

developer.apple.com

 

Apple Developer Documentation

 

developer.apple.com

 

GitHub - ashishkakkad8/SwiftXMLParsingDemo

Contribute to ashishkakkad8/SwiftXMLParsingDemo development by creating an account on GitHub.

github.com