Trabalho com XML em Swift (iOS/macOS)
XML (Extensible Markup Language) continua sendo um formato popular para troca de dados, arquivos de configuração e armazenamento de informações estruturadas. No ecossistema Apple (iOS, macOS, watchOS, tvOS), os recursos integrados do Foundation oferecem duas abordagens principais para trabalhar com XML: parsing sequencial (semelhante ao SAX) usando XMLParser e a abordagem de árvore DOM através de XMLDocument (disponível no macOS). Neste artigo, analisaremos detalhadamente ambos os métodos, forneceremos exemplos práticos e abordaremos cenários de uso típicos.
1. Parsing sequencial com XMLParser
XMLParser é um parser orientado a eventos, parte do Foundation. Ele não carrega todo o XML na memória, mas analisa o documento sequencialmente, chamando métodos do delegado ao encontrar elementos, atributos, texto, etc. É a solução ideal para arquivos grandes ou dados em fluxo.
Exemplo básico de parsing de feed RSS
import Foundation
// 1. Criando a classe delegadaclass RSSParserDelegate: NSObject, XMLParserDelegate { var currentElement = "" var currentTitle = "" var currentLink = "" var items: [(title: String, link: String)] = [] // Chamado ao abrir uma tag func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" currentLink = "" } } // Chamado ao encontrar conteúdo textual func parser(_ parser: XMLParser, foundCharacters string: String) { switch currentElement { case "title": currentTitle += string case "link": currentLink += string default: break } } // Chamado ao fechar uma tag func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "item" { items.append((title: currentTitle.trimmingCharacters(in: .whitespacesAndNewlines), link: currentLink.trimmingCharacters(in: .whitespacesAndNewlines))) } }}
// 2. Usolet xmlString = """<rss> <channel> <item> <title>Swift 5.9 Features</title> <link>https://example.com/swift-5-9</link> </item> </channel></rss>"""
guard let data = xmlString.data(using: .utf8) else { fatalError() }let parser = XMLParser(data: data)let delegate = RSSParserDelegate()parser.delegate = delegate
if parser.parse() { for item in delegate.items { print("Title: \\(item.title), Link: \\(item.link)") }} else { print("Erro de parsing: \\(parser.parserError?.localizedDescription ?? "desconhecido")")}2. Modelo de árvore: XMLDocument (apenas macOS)
No macOS (e em aplicativos que usam Swift Package Manager com o framework Foundation no modo macOS), a classe XMLDocument, que herda de XMLNode, está disponível. Ela permite carregar todo o XML na memória e manipulá-lo como uma árvore. Isso é conveniente para documentos pequenos quando é necessário acesso aleatório aos nós.
Criação e modificação de documento XML
import Foundation
// Criando o elemento raizlet rootElement = XMLElement(name: "catalog")let document = XMLDocument(rootElement: rootElement)
// Adicionando elemento filho com atributolet book = XMLElement(name: "book")book.addAttribute(XMLNode.attribute(withName: "id", stringValue: "101") as! XMLNode)let title = XMLElement(name: "title", stringValue: "Swift Programming")let author = XMLElement(name: "author", stringValu Também na biblioteca
Crossbeam para Rust: guia completo com exemplos práticos
Internacionalização (i18n) em TypeScript: guia completo
Entity Framework Core para C# (.NET): guia completo com exemplos
Envio de Email em C# (.NET): biblioteca System.Net.Mail