[swift] Swift로 HTTP 요청에서 XML 파싱하기

소개

이번에는 Swift에서 HTTP 요청을 보내고 응답으로 받은 XML 데이터를 파싱하는 방법에 대해 알아보겠습니다. Swift에서는 URLSession 클래스를 사용하여 HTTP 요청을 보내고, XMLParser 클래스를 사용하여 XML 데이터를 파싱할 수 있습니다.

HTTP 요청 보내기

HTTP 요청을 보내기 위해서는 URLSession 클래스와 URLRequest 클래스를 사용해야 합니다. 아래의 코드는 HTTP GET 요청을 보내는 예제입니다.

let url = URL(string: "http://example.com/data.xml")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("Error: \(error)")
        return
    }
    guard let data = data else {
        print("No data received")
        return
    }
    let xmlString = String(data: data, encoding: .utf8)
    print("Received data: \(xmlString)")
}
task.resume()

위의 코드에서 URL 객체를 생성하여 요청할 URL을 전달합니다. 그리고 URLSession.shared.dataTask(with:completionHandler:) 메서드를 사용하여 데이터를 요청하고 응답을 처리합니다. 응답으로 받은 데이터는 data 매개변수에 저장되며, 이 데이터는 XML 형식이 될 것입니다.

XML 파싱하기

XML 데이터를 파싱하기 위해서는 XMLParser 클래스를 사용합니다. XMLParserDelegate 프로토콜을 채택하여 파싱 이벤트를 처리하는 메서드를 구현해야 합니다. 아래의 코드는 XML 데이터를 파싱하여 태그 이름과 속성을 출력하는 예제입니다.

class XMLParserDelegate: NSObject, XMLParserDelegate {
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        print("Start element: \(elementName)")
        for (key, value) in attributeDict {
            print("Attribute: \(key) - \(value)")
        }
    }
    
    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        print("End element: \(elementName)")
    }
    
    func parser(_ parser: XMLParser, foundCharacters string: String) {
        let trimmedString = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
        if !trimmedString.isEmpty {
            print("Text: \(trimmedString)")
        }
    }
}

let data = ... // XML 데이터를 받은 데이터로 초기화
let parser = XMLParser(data: data)
let delegate = XMLParserDelegate()
parser.delegate = delegate
parser.parse()

위의 코드에서 XMLParserDelegate 클래스는 XMLParserDelegate 프로토콜을 채택하며, didStartElement, didEndElement, foundCharacters 메서드를 구현합니다. 이 메서드들은 각각 요소의 시작, 종료, 텍스트를 처리하는 역할을 합니다.

XMLParser 객체를 생성하여 파싱할 데이터를 전달하고, 위에서 구현한 XMLParserDelegate 인스턴스를 delegate로 설정합니다. 마지막으로 parse 메서드를 호출하여 파싱을 시작합니다.

결론

이제 Swift에서 HTTP 요청을 보내고 응답으로 받은 XML 데이터를 파싱하는 방법에 대해 알아보았습니다. URLSession 클래스를 사용하여 HTTP 요청을 보내고, XMLParser 클래스를 사용하여 XML 데이터를 파싱할 수 있습니다. 이를 활용하여 다양한 웹 서비스와의 통신 및 데이터 처리를 할 수 있습니다.