Travailler avec XML en Swift (iOS/macOS)
XML (Extensible Markup Language) reste un format très utilisé pour l'échange de données, les fichiers de configuration et le stockage d'informations structurées. Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), les outils intégrés de Foundation offrent deux approches principales pour travailler avec XML : l'analyse en flux (de type SAX) avec XMLParser et l'approche arborescente DOM via XMLDocument (disponible sur macOS). Dans cet article, nous détaillerons les deux méthodes, fournirons des exemples pratiques et examinerons les scénarios d'utilisation typiques.
1. Analyse en flux avec XMLParser
XMLParser est un analyseur orienté événements inclus dans Foundation. Il ne charge pas tout le XML en mémoire, mais analyse séquentiellement le document, appelant les méthodes du délégué lors de la détection d'éléments, d'attributs, de texte, etc. C'est une solution idéale pour les fichiers volumineux ou les données en flux.
Exemple de base d'analyse d'un flux RSS
import Foundation
// 1. Création de la classe déléguéeclass RSSParserDelegate: NSObject, XMLParserDelegate { var currentElement = "" var currentTitle = "" var currentLink = "" var items: [(title: String, link: String)] = [] // Appelé à l'ouverture d'une balise func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" currentLink = "" } } // Appelé lors de la détection d'un contenu textuel func parser(_ parser: XMLParser, foundCharacters string: String) { switch currentElement { case "title": currentTitle += string case "link": currentLink += string default: break } } // Appelé à la fermeture d'une balise 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. Utilisationlet 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("Parse error: \\(parser.parserError?.localizedDescription ?? "unknown")")}2. Modèle arborescent : XMLDocument (macOS uniquement)
Sur macOS (et dans les applications utilisant Swift Package Manager avec le framework Foundation en mode macOS), la classe XMLDocument, héritant de XMLNode, est disponible. Elle permet de charger tout le XML en mémoire et de le manipuler comme un arbre. C'est pratique pour les petits documents lorsque l'accès aléatoire aux nœuds est nécessaire.
Création et modification d'un document XML
import Foundation
// Création de l'élément racinelet rootElement = XMLElement(name: "catalog")let document = XMLDocument(rootElement: rootElement)
// Ajout d'un élément enfant avec un attributlet 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 Aussi dans la bibliothèque
Eigen C++ : guide complet avec exemples pratiques
Mise en cache en Go (Golang) : Redis, in-memory et autres solutions
ORM pour Java : comparaison de Hibernate, MyBatis, JPA et Spring Data
Event Bus et le pattern Observer en JavaScript (Node.js) — création de systèmes d'événements flexibles
Planificateur de tâches PHP : gestionnaire de files d'attente de type cron en PHP