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"]} También en la biblioteca
Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código
Configuración de aplicaciones PHP: bibliotecas y herramientas para una configuración flexible
Generación de PDF en Swift (iOS/macOS): UIGraphicsPDFRenderer, PDFKit y Core Graphics
Lodash para JavaScript (Node.js): guía completa con ejemplos
Event Bus y el patrón Observer en TypeScript: implementación y ejemplos