Travailler avec XML en Swift (iOS/macOS) : guide complet
XML (eXtensible Markup Language) reste un format très demandé pour l'échange de données, les fichiers de configuration et les services web. Dans l'écosystème Apple, pour travailler avec XML en Swift, vous disposez à la fois des outils intégrés de Foundation (la classe XMLParser) et de bibliothèques tierces, comme SwiftXML. Dans cet article, nous allons détailler les deux approches avec des exemples de code pour iOS et macOS.
1. XMLParser intégré de Foundation
XMLParser est un analyseur SAX (séquentiel, orienté événements). Il ne charge pas l'intégralité du document en mémoire, mais l'analyse au fur et à mesure de la lecture, en appelant les méthodes du délégué. C'est idéal pour les gros fichiers XML.
1.1. Configuration de base et délégué
Créez une classe qui implémente le protocole XMLParserDelegate. Méthodes obligatoires :
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)— appelée à l'ouverture d'une balise.parser(_:foundCharacters:)— reçoit le contenu textuel de l'élément.parser(_:didEndElement:namespaceURI:qualifiedName:)— appelée à la fermeture de la balise.
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("Début du livre : \\(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("Titre : \\(currentText.trimmingCharacters(in: .whitespacesAndNewlines))") } }}
// Utilisationif let url = Bundle.main.url(forResource: "books", withExtension: "xml"), let parser = XMLParser(contentsOf: url) { let handler = XMLHandler() parser.delegate = handler parser.parse()}1.2. Gestion des erreurs et espaces de noms
Implémentez la méthode parser(_:parseErrorOccurred:) pour journaliser les erreurs. Pour travailler avec les espaces de noms, utilisez les paramètres namespaceURI et qualifiedName.
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { print("Erreur d'analyse : \\(parseError.localizedDescription)")}2. Création manuelle de documents XML
Pour générer du XML en Swift, vous pouvez utiliser des chaînes de caractères ou la bibliothèque XMLDocument de Foundation (disponible uniquement sur macOS). Sur iOS, vous devrez créer le XML manuellement.
2.1. Génération de XML via des chaînes (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. Utilisation de XMLDocument (macOS uniquement)
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 Aussi dans la bibliothèque
better-sqlite3-typescript avec TypeScript : guide complet et exemples
Guide complet Swagger-PHP pour PHP : tutoriel et exemples
Traitement d'images en Java : redimensionnement et recadrage (resize, crop)
Puppeteer JavaScript (Node.js) : guide complet avec exemples