IOS(iPhone)

ios swift3 XMLParsing XML 파싱하는 방법

알통몬_ 2017. 8. 8. 15:17
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 swift3 XMLParsing xml 파싱하는 방법에 대해 알아보겠습니다.


먼저 데이터를 담고 있는 xml 파일이 필요하겠죠?


https://sam.ple.com/data/sample.xml

처럼 xml 파일이 존재한다고 가정해보겠습니다.

<school>

<data>

<grade>1학년</grade>

<classes>5학급</classes>

<count>130명</count>

</data>


<data>

<grade>2학년</grade>

<classes>5학급</classes>

<count>130명</count>

</data>


<data>

<grade>3학년</grade>

<classes>4학급</classes>

<count>130명</count>

</data>


<data>

<grade>4학년</grade>

<classes>4학급</classes>

<count>130명</count>

</data>


<data>

<grade>5학년</grade>

<classes>4학급</classes>

<count>130명</count>

</data>


<data>

<grade>6학년</grade>

<classes>4학급</classes>

<count>130명</count>

</data>

</school>


위 파일을 ios 에서 받아와 간단히 프린트하는 거 까지만 보겠습니다.


먼저 XML을 받아와 파싱을 하려면 XMLParser 를 사용합니다.

ViewController.swift 파일만 보겠습니다.




import UIKit

class ViewController : UIViewController, XMLParserDelegate {

   var elementTemp = ""

   var datalist : [[String:String]] = [[:]]

   var detailData : [String:String] = [:]

   var blank: Bool = false

   override func viewDidLoad() {

      super.viewDidLoad()

      let baseURL = "https://sam.ple.com/data/sample.xml" // xml 파일이 있는 url 주소입니다.

      let xmlParser = XMLParser(contentsOf: URL(string: baseURL)!)

      xmlParser!.delegate = self

      xmlParser!.parse()

   }


   override func parser(_ parser: XMLParser, didStartElement elementName: String,

               namespaceURI: String?, qualifiedName qName: String?, 

               attributes attributeDict: [String:String] = [:]) {

          print("didStartElement : \(elementName)") // *

          elementTemp = elementName
          // 공백에 대한 처리

         blank = true

   }   

   override func parser(_ parser: XMLParser, foundCharacters string: String) {

         print("foundCharacters : \(string)") // *

          if blank == true && elementTemp != "data" && elementTemp != "school" {

             detailData[elementTemp] = string

          }


   }   

   override func parser(_ parser: XMLParser, didEndElement elementName: String,

               namespaceURI: String?, qua;ifiedName qName: String?) {

         if elementName == "data" {

            datalist += [detailData]

         }

         blank = false

         print("didEndElement : \(elementName)") // *

   }

}

 


위에처럼 하고 print()//*가 붙어있는 코드만 있을 때 

실행을 해보시면 콘솔에 아마 아래처럼 나올거에요.


didStartElement : school

foundCharacters : 

didStartElement : data

foundCharacters :

didStartElement : grade

foundCharacters : 1학년

didEndElement : grade

......


foundCharacters 에 값이 없는 이유는 공백도 값으로 잡기 때문에

저거에 대한 처리도 필요합니다.


이제 저 값들을 필요한 곳에 맞게 처리를 해주면 됩니다.

위 parser 함수들은 순서가 있는데요.

매개 변수 레이블이 didStartElement 가 있는 함수가 1번

foundCharacters 가 2번

didEndElement 가 3번입니다.

1번은 <> 태그를 발견했을 때

2번은 그 태그의 값을

3번은 </> 태그를 발견했을 때 호출됩니다.


때문에 1번과 3번에서 필요한 태그들만 값을 처리할 수 있도록 하는 코드가 필요하고

2번에서 가져온 값을 어딘가에 저장하는 코드가 필요하게 됩니다.


위 예제 같은 경우는 UITableView와 같이 사용해서 학년 별 학급과 총 학생 수를 보여주는

앱을 만들 수도 있겠죠?


이상입니다.


다음 포스팅에서는 JSONParsing 하는 방법에 대해 공부하겠습니다.


반응형