Trabalho com XML em Swift (iOS/macOS): parsing, criação e processamento

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations