XML파싱 해보기

0 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 남수
      참가자
      • 글작성 : 13
      • 답글작성 : 2

      XML이란..?
      Extensible Markup Language의 종류중 대표적인 언어에요

      Markup Language 란?
      태그, 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한 가지라고 사전에 나오네요
      <p>, <br>, <div> 이런 태그들 본적 있으시죠?? 그런 태그를 사용한 거에요
      대표적으로 HTML, XML언어가 있죠

      HTML 문자열로 응답을 받을 때 파싱받아서 앱에 적용 하고 싶은경우가 생길 수 있어요
      RSS(Rich Site Summary)가 대표적인 예로 있겠네요!
      RSS는 뉴스나 블로그 사이트에서 주로 사용하는 콘텐츠 표현 방식 이라고해요

      아무튼!! 이러한 XML로 이루어진 응답을 파싱해보는 방법에 대해서 알아보려고 해요

      예시로 구글뉴스의 RSS주소를 가져왔어요
      아래의 주소를 치면 사진과같이 응답이 와요

      https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko

      이러한 데이터중에서
      원하는 데이터가 <title>태그에 있을 수 도있고, <link>태그에 있을 수 도있고
      태그로 둘러쌓인 문자열만 골라서 가져와야겠죠??

      이 작업을 편하게 할 수 있도록 Xcode에서 지원해주는게
      바로 XMLParser이에요

      제일 기본적인 XMLParser사용법은

      var parser: XMLParser
      guard let url = URLComponents(string: rssURL)?.url else {
          return
      }
      parser = XMLParser(contentsOf: url)
      parser.delegate = self
      parser.parse()
      

      URL타입의 매개변수를 넣어줘서 XMLParser객체를 생성하고
      parse() 를 통해서
      넣어준 URL의 응답을 파싱하기 시작해요
      파싱받는 값은

      XMLParserDelegate 에 로직을 구현해야해요

      // 태그의 시작
      func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:])

      // 태그의 끝
      func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)

      // 태그사이의 문자열
      func parser(_ parser: XMLParser, foundCharacters string: String)

      // 에러시, abortParsing()사용시
      func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error)

      <title>타이틀입니다</title>

      이런 XML이 있다면
      didStartElement elementName => title
      didEndElement elementName => title
      foundCharacters string => 타이틀입니다

      이렇게 값을 받을 수 있어요

      그리고 파싱을 그만두고싶다!?
      abortParsing() 을 통해서 멈추게 할 수 있어요
      이 함수를 실행 시키면
      func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) delegate함수를 통해서
      정보가 전달된다고 하네요

      문자열을 가져올 때
      주의할점이 있어요
      xml태그끝에 빈칸을 인식하기때문에
      데이터가 아닌 빈배열저장 되는 문제가 발생해요

      (예시)
      <country>한국</country>
      에서 한국과 </country>뒤의 공백문자를인식해요

      해결방법으로는
      Bool형 변수 트리거 방식
      혹은
      trimmingCharacters(in: .whitespacesAndNewlines) 을 이용해서 앞뒤 공백을 제거할 수도 있어요

0 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom