Trabalho com XML em Swift (iOS/macOS): do parsing à criação
XML (eXtensible Markup Language) continua sendo usado em sistemas legados, serviços web (SOAP, RSS) e arquivos de configuração. Em Swift para iOS/macOS não há uma biblioteca nativa com açúcar sintático, mas existe o poderoso XMLParser (parser SAX), além da popular biblioteca de terceiros AEXML (abordagem DOM). Neste artigo, abordaremos ambas as abordagens.
1. XMLParser nativo (abordagem SAX)
XMLParser é um parser orientado a eventos (SAX) do Foundation. Ele não carrega todo o documento na memória, mas chama métodos do delegate ao encontrar elementos. Ideal para arquivos grandes.
Exemplo: parsing de feed RSS
import Foundation
class RSSParser: NSObject, XMLParserDelegate { private var currentElement = "" private var currentTitle = "" private var items: [String] = []
func parse(data: Data) -> [String] { let parser = XMLParser(data: data) parser.delegate = self parser.parse() return items }
// MARK: - XMLParserDelegate func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" } }
func parser(_ parser: XMLParser, foundCharacters string: String) { if currentElement == "title" { currentTitle += string } }
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "title" && !currentTitle.isEmpty { items.append(currentTitle.trimmingCharacters(in: .whitespacesAndNewlines)) } }}
// Usolet xmlString = """<rss> <channel> <item><title>Swift 6.0</title></item> <item><title>Novos recursos do Xcode</title></item> </channel></rss>"""if let data = xmlString.data(using: .utf8) { let parser = RSSParser() let titles = parser.parse(data: data) print(titles) // ["Swift 6.0", "Novos recursos do Xcode"]}Importante: foundCharacters pode ser chamado várias vezes para um mesmo nó de texto (especialmente com cirílico). Sempre acumule a string, não a atribua.
2. AEXML — biblioteca DOM conveniente
AEXML é uma biblioteca leve para trabalhar com XML no estilo DOM. Permite ler e criar XML sem gerenciamento manual de eventos. Instala-se via Swift Package Manager ou CocoaPods.
Instalação via Swift Package Manager
Adicione em Package.swift ou via Xcode: File → Add Packages → insira a URL: https://github.com/tadija/AEXML.git
Exemplo: leitura de XML
import AEXML
func parseWithAEXML(xmlString: String) -> [String: String]? { do { let xmlDoc = try AEXMLDocument(xml: xmlString) let root = xmlDoc.root
// Obtém o valor do elemento let name = root["user"]["name"].value ?? "" let age = root["user"]["age"].value ?? ""
// Acesso por atributo let id = root["user"].attributes["id"] ?? ""
return ["id": id, "name": name, "age": age] } catch { print("Erro de parsing: \\(error)") return nil }}
// Exemplo XMLlet xmlData = """<root> <user id="42"> <name>Ivan Petrov</name> <age>30</age> </user></root>"""if let result = parseWithAEXML(xmlString: xmlData) { print(result) // ["id": "42", "name": "I Também na biblioteca
Análise de HTML em C++: Visão geral das bibliotecas Gumbo, MyHTML e htmlcxx
Validação de dados em JavaScript (Node.js) com Joi e Yup
Cliente OAuth para TypeScript: integração de autorização em aplicações web
Agendador de Tarefas PHP: tarefas semelhantes ao cron sem crond