Trabajo con XML en Swift (iOS/macOS): guía completa
XML (eXtensible Markup Language) sigue siendo un formato demandado para el intercambio de datos, archivos de configuración y servicios web. En el ecosistema de Apple, para trabajar con XML en Swift están disponibles tanto las herramientas integradas de Foundation (clase XMLParser) como bibliotecas de terceros, por ejemplo SwiftXML. En este artículo analizaremos en detalle ambos enfoques con ejemplos de código para iOS y macOS.
1. XMLParser integrado de Foundation
XMLParser es un analizador SAX (secuencial, orientado a eventos). No carga todo el documento en memoria, sino que lo analiza a medida que lo lee, llamando a los métodos del delegado. Esto es ideal para archivos XML grandes.
1.1. Configuración básica y delegado
Cree una clase que implemente el protocolo XMLParserDelegate. Métodos obligatorios:
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)— se llama al abrir una etiqueta.parser(_:foundCharacters:)— recibe el contenido textual del elemento.parser(_:didEndElement:namespaceURI:qualifiedName:)— se llama al cerrar la etiqueta.
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("Inicio del libro: \\(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("Título: \\(currentText.trimmingCharacters(in: .whitespacesAndNewlines))") } }}
// Usoif let url = Bundle.main.url(forResource: "books", withExtension: "xml"), let parser = XMLParser(contentsOf: url) { let handler = XMLHandler() parser.delegate = handler parser.parse()}1.2. Manejo de errores y espacios de nombres
Implemente el método parser(_:parseErrorOccurred:) para registrar errores. Para trabajar con espacios de nombres, use los parámetros namespaceURI y qualifiedName.
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { print("Error de análisis: \\(parseError.localizedDescription)")}2. Creación manual de documentos XML
Para generar XML en Swift se pueden usar cadenas o la biblioteca XMLDocument de Foundation (disponible solo en macOS). En iOS, será necesario crear XML manualmente.
2.1. Generación de XML mediante cadenas (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. Uso de XMLDocument (solo 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 También en la biblioteca
Nodemailer — envío de correos electrónicos con TypeScript
Monitoreo de aplicaciones Go: bibliotecas y herramientas