Trabajo con XML en Swift: análisis, creación y procesamiento de datos (iOS/macOS)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con XML en Swift (iOS/macOS): desde el análisis hasta la creación



XML (eXtensible Markup Language) sigue utilizándose en sistemas heredados, servicios web (SOAP, RSS) y archivos de configuración. En Swift para iOS/macOS no hay una biblioteca integrada con azúcar sintáctico, pero existe el potente XMLParser (analizador SAX), así como la popular biblioteca de terceros AEXML (enfoque DOM). En este artículo analizaremos ambos enfoques.



1. XMLParser integrado (enfoque SAX)



XMLParser es un analizador orientado a eventos (SAX) de Foundation. No carga todo el documento en memoria, sino que llama a métodos del delegado al encontrar elementos. Es ideal para archivos grandes.



Ejemplo: análisis de un feed RSS



import Foundation

class RSSParser: NSObject, XMLParserDelegate { private var currentElement = "" private var currentTitle = "" private var items: [String] = []

func parse(data: Data) -> [String] { let parser = XMLParser(data: data) parser.delegate = self parser.parse() return items }

// MARK: - XMLParserDelegate func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { currentElement = elementName if elementName == "item" { currentTitle = "" } }

func parser(_ parser: XMLParser, foundCharacters string: String) { if currentElement == "title" { currentTitle += string } }

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "title" && !currentTitle.isEmpty { items.append(currentTitle.trimmingCharacters(in: .whitespacesAndNewlines)) } }}

// Usolet xmlString = """<rss> <channel> <item><title>Swift 6.0</title></item> <item><title>Nuevas funciones de Xcode</title></item> </channel></rss>"""if let data = xmlString.data(using: .utf8) { let parser = RSSParser() let titles = parser.parse(data: data) print(titles) // ["Swift 6.0", "Nuevas funciones de Xcode"]}


Importante: foundCharacters puede llamarse varias veces para un mismo nodo de texto (especialmente con cirílico). Siempre acumule la cadena, no la asigne.



2. AEXML — una práctica biblioteca DOM



AEXML es una biblioteca ligera para trabajar con XML al estilo DOM. Permite leer y crear XML sin gestión manual de eventos. Se instala a través de Swift Package Manager o CocoaPods.



Instalación mediante Swift Package Manager

Agréguela en Package.swift o a través de Xcode: File → Add Packages → ingrese la URL: https://github.com/tadija/AEXML.git



Ejemplo: lectura de XML



import AEXML

func parseWithAEXML(xmlString: String) -> [String: String]? { do { let xmlDoc = try AEXMLDocument(xml: xmlString) let root = xmlDoc.root

// Obtener el valor del elemento let name = root["user"]["name"].value ?? "" let age = root["user"]["age"].value ?? ""

// Acceso por atributo let id = root["user"].attributes["id"] ?? ""

return ["id": id, "name": name, "age": age] } catch { print("Error de análisis: \\(error)") return nil }}

// Ejemplo XMLlet xmlData = """<root> <user id="42"> <name>Ivan Petrov</name> <age>30</age> </user></root>"""if let result = parseWithAEXML(xmlString: xmlData) { print(result) // ["id": "42", "name": "Ivan Petrov", "age": "30"]}

Recommendations