[RC] XML 파싱하기

iOSoo·2021년 10월 13일
0
post-thumbnail

1. 코드 설명

  • 전체 코드
import UIKit

class ViewController: UIViewController, XMLParserDelegate {
    
    var xmlParser = XMLParser()
    
    var currentElement = ""
    var items = [[String : String]]()
    var item = [String : String]()
    
    var covidgubun = "" //시도명
    var covidincDec = "" //전일 대비 증감 수
    var coviddefCnt = "" //코로나 확진자 수
    var covidisolIngCnt = "" //현재 격리중인 환자 수
    

    override func viewDidLoad() {
        super.viewDidLoad()
        requestCovidInfo()
    }
    
    
    
    func requestCovidInfo() {
        
        //MARK: - view가 load 되는 현재 시간 저장
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyyMMdd"
        let current_date_string = formatter.string(from: Date())
        //print(current_date_string)
        
        let url = "http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson?serviceKey=2yD7EAVjVn6s7TOB869TohgRaubtsfz2hXk2RZKdv%2FHPLcJiFtZobJXfo2w7W4d%2F55NE6nJccDXb9km9qifGRA%3D%3D&pageNo=1&numOfRows=10&startCreateDt=\(current_date_string)&endCreateDt=\(current_date_string)"
        
        guard let xmlParser = XMLParser(contentsOf: URL(string: url)!) else { return }
        xmlParser.delegate = self
        xmlParser.parse()
  
    }
    //MARK: - XML 파서가 시작 테그를 만나면 호출됨
    public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        currentElement = elementName
        if elementName == "item" {
            item = [String : String]()
            covidgubun = ""
            covidincDec = ""
            coviddefCnt = ""
            covidisolIngCnt = ""
            //print("didStartElement")
        }
    }
    //MARK: - XML 파서가 종료 테그를 만나면 호출됨
    public func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if elementName == "item" {
            item["gubun"] = covidgubun
            item["incDec"] = covidincDec
            item["defCnt"] = coviddefCnt
            item["isolIngCnt"] = covidisolIngCnt
            items.append(item)

            //print("didEndElement")
        }
        
    }
    //MARK: - 현재 테그에 담겨있는 문자열 전달
    public func parser(_ parser: XMLParser, foundCharacters string: String) {
        //print("foundCharacters")
        
        if currentElement == "gubun" {
            covidgubun = string
            print("시도명: \(covidgubun)")
            //print("foundCharacters1")
        } else if (currentElement == "incDec") {
            covidincDec = string
            print("오늘 확진자 수 :\(covidincDec)")
            //print("foundCharacters2")
        } else if (currentElement == "defCnt") {
            coviddefCnt = string
            print("총 확진자 수:\(coviddefCnt)")
            //print("foundCharacters2")
        } else if (currentElement == "isolIngCnt") {
            covidisolIngCnt = string
            print("격리중인 환자 수:\(covidisolIngCnt)")
            print("-----------------------")
            //print("foundCharacters2")
        }
    }
    

}
  • 부분 코드 설명
var currentElement = "" //현재 Element
    var items = [[String : String]]() 
    var item = [String : String]()

items와 item은 xml 파일을 보고 작성하였다. xml 파일을 보게되면 items라는 Dictional Array안에 여러개의 item Dictionary이 있고 그 내부에 gubun, incDec, defCnt등등의 개체가 있는 것을 확인 할 수 있다.

<items>
|       <item>
|       |    <createDt>2021-10-13 09:48:05.982</createDt>
|       |    <deathCnt>15</deathCnt>
|       |    <defCnt>6197</defCnt>
|       |    <gubun>검역</gubun>
|       |    <gubunCn>隔離區</gubunCn>
|       |    <gubunEn>Lazaretto</gubunEn>
|       |    <incDec>5</incDec>
|       |    <isolClearCnt>5990</isolClearCnt>
|       |    <isolIngCnt>192</isolIngCnt>
|       |    <localOccCnt>0</localOccCnt>
|       |    <overFlowCnt>5</overFlowCnt>
|       |    <qurRate>-</qurRate>
|       |    <seq>12663</seq>
|       |    <stdDay>2021년 10월 13일 00시</stdDay>
|       |    <updateDt>null</updateDt>
|       </item>
</items>

public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        currentElement = elementName
        if elementName == "item" {
            item = [String : String]()
            covidgubun = ""
            covidincDec = ""
            coviddefCnt = ""
            covidisolIngCnt = ""
            //print("didStartElement")
        }
    }

XML 파서가 시작 테그를 만났을 때 태그이름이 item이라면 선언 변수들을 초기화 해준다.


ppublic func parser(_ parser: XMLParser, foundCharacters string: String) {
        //print("foundCharacters")
        
        if currentElement == "gubun" {
            covidgubun = string
            print("시도명: \(covidgubun)")
            //print("foundCharacters1")
        } else if (currentElement == "incDec") {
            covidincDec = string
            print("오늘 확진자 수 :\(covidincDec)")
            //print("foundCharacters2")
        } else if (currentElement == "defCnt") {
            coviddefCnt = string
            print("총 확진자 수:\(coviddefCnt)")
            //print("foundCharacters2")
        } else if (currentElement == "isolIngCnt") {
            covidisolIngCnt = string
            print("격리중인 환자 수:\(covidisolIngCnt)")
            print("-----------------------")
            //print("foundCharacters2")
        }
    }

현재 테그에 담겨있는 문자열을 각각 문자에 따라서 전달한다.

http 통신 허용

info - open As - Source code로 열어서 아래의 코드를 사진의 위치(첫 dict 다음에) 작성해준다.

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

깃허브

https://github.com/iOS-junsoo/COVID-19_virus-status-xml-

profile
애플을 좋아하는 비전공생

0개의 댓글