Trabalho com XML em Swift (iOS/macOS): guia completo
XML (eXtensible Markup Language) continua sendo um formato popular para troca de dados, arquivos de configuração e serviços web. No ecossistema Apple, para trabalhar com XML em Swift, estão disponíveis tanto as ferramentas integradas da Foundation (classe XMLParser) quanto bibliotecas de terceiros, como SwiftXML. Neste artigo, abordaremos detalhadamente ambas as abordagens com exemplos de código para iOS e macOS.
1. XMLParser integrado da Foundation
XMLParser é um parser SAX (sequencial, orientado a eventos). Ele não carrega todo o documento na memória, mas o analisa à medida que lê, chamando métodos do delegate. Isso é ideal para arquivos XML grandes.
1.1. Configuração básica e delegate
Crie uma classe que implemente o protocolo XMLParserDelegate. Métodos obrigatórios:
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)— chamado ao abrir uma tag.parser(_:foundCharacters:)— recebe o conteúdo textual do elemento.parser(_:didEndElement:namespaceURI:qualifiedName:)— chamado ao fechar uma tag.
import Foundation
class XMLHandler: NSObject, XMLParserDelegate { var currentElement = "" var currentText = ""
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName currentText = "" if elementName == "book" { print("Início do livro: \\(attributeDict["id"] ?? "")") } }
func parser(_ parser: XMLParser, foundCharacters string: String) { currentText += string }
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "title" { print("Título: \\(currentText.trimmingCharacters(in: .whitespacesAndNewlines))") } }}
// Usoif let url = Bundle.main.url(forResource: "books", withExtension: "xml"), let parser = XMLParser(contentsOf: url) { let handler = XMLHandler() parser.delegate = handler parser.parse()}1.2. Tratamento de erros e namespaces
Implemente o método parser(_:parseErrorOccurred:) para registrar erros. Para trabalhar com namespaces, use os parâmetros namespaceURI e qualifiedName.
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { print("Erro de parsing: \\(parseError.localizedDescription)")}2. Criação manual de documentos XML
Para gerar XML em Swift, você pode usar strings ou a biblioteca XMLDocument da Foundation (disponível apenas no macOS). No iOS, é necessário criar XML manualmente.
2.1. Geração de XML via strings (iOS/macOS)
func createXMLString() -> String { var xml = "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>" xml += "<library>" xml += " <book id=\\"1\\">" xml += " <title>Swift Programming</title>" xml += " <author>Apple Inc.</author>" xml += " </book>" xml += "</library>" return xml}
let xmlString = createXMLString()print(xmlString)2.2. Uso de XMLDocument (apenas macOS)
import Foundation
let root = XMLElement(name: "library")let book = XMLElement(name: "book")book.addAttribute(XMLNode.attribute(withName: "id", stringValue: "1") as! XMLNode)
let title = XMLElement(name: "title", stringValue: "Swi