Arbeiten mit XML in Swift (iOS/macOS): Parsen, Erstellen und Verarbeiten

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit XML in Swift (iOS/macOS)



XML (Extensible Markup Language) bleibt ein gefragtes Format für den Datenaustausch, Konfigurationsdateien und die Speicherung strukturierter Informationen. Im Apple-Ökosystem (iOS, macOS, watchOS, tvOS) bieten die integrierten Foundation-Methoden zwei Hauptansätze für die Arbeit mit XML: Streaming-Parsing (SAX-ähnlich) mit XMLParser und den Baumstruktur-DOM-Ansatz über XMLDocument (verfügbar auf macOS). In diesem Artikel werden wir beide Methoden im Detail besprechen, praktische Beispiele geben und typische Anwendungsszenarien betrachten.



1. Streaming-Parsing mit XMLParser



XMLParser ist ein ereignisgesteuerter Parser, der zu Foundation gehört. Er lädt nicht das gesamte XML in den Speicher, sondern analysiert das Dokument sequenziell und ruft Delegatenmethoden beim Auffinden von Elementen, Attributen, Text usw. auf. Dies ist die ideale Lösung für große Dateien oder Streaming-Daten.



Basisbeispiel zum Parsen eines RSS-Feeds



import Foundation

// 1. Erstellen einer Delegatenklasseclass RSSParserDelegate: NSObject, XMLParserDelegate { var currentElement = "" var currentTitle = "" var currentLink = "" var items: [(title: String, link: String)] = [] // Wird beim Öffnen eines Tags aufgerufen func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" currentLink = "" } } // Wird beim Auffinden von Textinhalten aufgerufen func parser(_ parser: XMLParser, foundCharacters string: String) { switch currentElement { case "title": currentTitle += string case "link": currentLink += string default: break } } // Wird beim Schließen eines Tags aufgerufen 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. Verwendunglet 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. Baumstruktur-Modell: XMLDocument (nur macOS)



Auf macOS (und in Anwendungen, die Swift Package Manager mit dem Foundation-Framework im macOS-Modus verwenden) ist die Klasse XMLDocument verfügbar, die von XMLNode erbt. Sie ermöglicht das Laden des gesamten XML in den Speicher und die Manipulation als Baum. Dies ist praktisch für kleine Dokumente, wenn ein wahlfreier Zugriff auf Knoten erforderlich ist.



Erstellen und Ändern eines XML-Dokuments



import Foundation

// Erstellen des Wurzelelementslet rootElement = XMLElement(name: "catalog")let document = XMLDocument(rootElement: rootElement)

// Hinzufügen eines untergeordneten Elements mit 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

Empfehlungen