Travailler avec XML en Swift (iOS/macOS) : analyse, création et traitement

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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

Recommendations