Arbeit mit XML in Swift (iOS/macOS): vollständige Anleitung
XML (eXtensible Markup Language) bleibt ein gefragtes Format für Datenaustausch, Konfigurationsdateien und Webdienste. Im Apple-Ökosystem stehen für die Arbeit mit XML in Swift sowohl die integrierten Foundation-Mittel (Klasse XMLParser) als auch externe Bibliotheken wie SwiftXML zur Verfügung. In diesem Artikel werden wir beide Ansätze mit Codebeispielen für iOS und macOS detailliert behandeln.
1. Integrierter XMLParser aus Foundation
XMLParser ist ein SAX-Parser (sequentiell, ereignisgesteuert). Er lädt nicht das gesamte Dokument in den Speicher, sondern analysiert es beim Lesen und ruft Delegatenmethoden auf. Dies ist ideal für große XML-Dateien.
1.1. Basiskonfiguration und Delegat
Erstellen Sie eine Klasse, die das Protokoll XMLParserDelegate implementiert. Erforderliche Methoden:
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)— wird beim Öffnen eines Tags aufgerufen.parser(_:foundCharacters:)— erhält den Textinhalt des Elements.parser(_:didEndElement:namespaceURI:qualifiedName:)— wird beim Schließen eines Tags aufgerufen.
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("Beginn des Buches: \\(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("Titel: \\(currentText.trimmingCharacters(in: .whitespacesAndNewlines))") } }}
// Verwendungif let url = Bundle.main.url(forResource: "books", withExtension: "xml"), let parser = XMLParser(contentsOf: url) { let handler = XMLHandler() parser.delegate = handler parser.parse()}1.2. Fehlerbehandlung und Namensräume
Implementieren Sie die Methode parser(_:parseErrorOccurred:) zur Fehlerprotokollierung. Für die Arbeit mit Namensräumen verwenden Sie die Parameter namespaceURI und qualifiedName.
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { print("Parsing-Fehler: \\(parseError.localizedDescription)")}2. Manuelle Erstellung von XML-Dokumenten
Zur Generierung von XML in Swift können Sie Strings oder die Bibliothek XMLDocument aus Foundation (nur auf macOS verfügbar) verwenden. Auf iOS müssen Sie XML manuell erstellen.
2.1. XML-Generierung über Strings (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. Verwendung von XMLDocument (nur macOS)
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