Conversor de Objective-C a XML
Pega interfaces u objetos de Objective-C. Obtén XML limpio.
Qué hace esta herramienta
Si alguna vez has tenido que montar a mano una carga XML que encajara con un modelo Objective-C — para un servicio SOAP viejo, un archivo plist, una configuración de Cocoa o un fixture de pruebas — ya conoces el baile. Cuentas las líneas @property, eliminas los calificadores de tipo, recuerdas cuáles son contenedores NSArray y cruzas los dedos para que la forma salga bien. Pega el Objective-C aquí y te devolvemos XML bien formado en una sola pasada. Un único fragmento alloc/init, un archivo de cabecera entero con varios bloques @interface o un modelo profundamente anidado — el resultado es el mismo.
No es un reemplazo de texto ingenuo. El conversor sigue cómo Cocoa realmente mapea a XML. Los valores NSString se convierten en nodos de texto (escapados correctamente). NSNumber y NSDecimalNumber pierden su envoltorio y se convierten en texto numérico plano — así que [NSDecimalNumber decimalNumberWithString:@"249.99"] sale como 249.99. Los valores BOOL se convierten en true / false o en la variante YES / NO si eso es lo que espera tu esquema. NSArray<OrderItem *> se convierte en un elemento contenedor con un hijo por ítem, nombrado según el tipo del elemento — la misma forma que emiten los árboles de NSXMLElement.
Las variables de instancia de respaldo también se manejan. Si tu @property usa @synthesize customerName = _customerName;, el elemento sigue llamándose customerName, no _customerName — el nombre del iVar es un detalle de implementación, no parte del formato de cable. Los objetos anidados (un Order con un @property Address) se expanden en el sitio, y los valores nil se convierten en elementos vacíos para que la forma quede consistente. Si pegas varios bloques @interface, todos acaban en la salida. Pégalo tal como está en tu archivo .h — sin limpieza previa — y compara el resultado con lo que produciría NSXMLDocument.
Cómo usarlo
Tres pasos. Funciona igual si pegas una clase o un paquete de cabeceras entero.
Pega tu Objective-C (o prueba el ejemplo)
Mete tu Objective-C en el editor de la izquierda tal cual. Un bloque @interface, un literal de objeto alloc/init, varias clases o tipos anidados — todo vale. Pulsa Cargar ejemplo para ver primero un ejemplo realista de Order / OrderItem / Address.
No hace falta eliminar los atributos @property, quitar pragmas o limpiar sentencias import. Deja el código como se ve en Xcode. El parser sabe leer un archivo .h o .m real.
Pulsa Convertir
Haz clic en el botón verde Convertir. La herramienta lee el Objective-C, conserva cada @property, preserva los objetos anidados y construye el XML de una pasada. Mientras trabaja, aparece un breve indicador de carga.
Copia el XML
El panel derecho se llena con XML indentado y bien formado que cualquier parser compatible con los estándares — incluido NSXMLParser — aceptará. Cópialo en un plist, en el cuerpo de una petición SOAP, en un fixture de pruebas o en tu documentación.
Cuándo resulta realmente útil
Montar fixtures plist para iOS
Tienes un modelo Objective-C y necesitas un Info.plist o un plist de datos semilla que cuadre. Pega la clase, obtén el XML, suéltalo en tu bundle — sin escribir a mano pares <code><dict></code> / <code><key></code>.
Archivos de configuración XML de Cocoa
Las apps de escritorio Cocoa antiguas todavía traen configuración XML. Convierte tu clase <code>Settings</code> en una plantilla lista para editar para que la configuración coincida con el código que la lee.
Clientes SOAP / WCF heredados en iOS
Si tu app iOS todavía habla con un endpoint SOAP, puedes pegar la clase del contrato de petición y obtener el cuerpo del sobre XML — más fácil que construir árboles <code>NSXMLElement</code> a mano.
Alimentar flujos XML en Mac OS
Las integraciones antiguas de AppleScript / Automator / XML-RPC esperan XML. Pega el modelo Objective-C, saca el XML y mételo en el flujo — sin traducción manual.
Preguntas habituales
¿Puedo pegar varias declaraciones @interface a la vez?
Sí. Pega un archivo de cabecera entero. Cada @interface pasa con los tipos anidados expandidos. Si tu @interface declara ivars explícitamente (dentro de { }) o usa el estilo moderno solo-@property, ambos funcionan igual.
¿Cómo se tratan los atributos @property?
Atributos como (nonatomic, copy), (strong), (weak), (readonly) y (assign) son metadatos para el runtime — no cambian la forma serializada. El nombre del elemento es el nombre de la propiedad. Las propiedades readonly se emiten igualmente (siguen teniendo un valor). Las propiedades calculadas con getters personalizados se tratan como cualquier otra propiedad.
Y sobre los nombres de iVar — ¿salen elementos con _guión bajo?
No. Si tu propiedad es customerName y el iVar de respaldo es _customerName, el elemento XML es <customerName>. El guión bajo es una convención de Objective-C, no un formato de cable. Si quieres renombrar un elemento, renombra el propio @property y vuelve a pegar.
¿Cómo se tratan NSString, NSNumber, NSDecimalNumber, BOOL y NSDate?
NSString se convierte en un nodo de texto con el escape XML correcto. NSNumber y NSDecimalNumber pierden su envoltorio y se vuelven texto numérico plano. BOOL sale como true / false (o YES / NO si el código fuente usa la convención plist). NSDate sale como cadena ISO-8601. Los valores nil se convierten en elementos vacíos en lugar de ser eliminados.
¿Y NSArray, NSDictionary y objetos anidados?
NSArray<OrderItem *> se convierte en un elemento contenedor con un hijo por ítem, nombrado según el tipo del elemento: <items><OrderItem/><OrderItem/></items>. NSDictionary se convierte en un contenedor de <entry><key/><value/></entry>. Los objetos anidados (una propiedad cuyo tipo es otra @interface) se expanden en el sitio con cada campo intacto.
¿Se guarda mi código?
Tu código se envía al backend para la conversión y no se persiste — no registramos la carga útil. Como siempre con herramientas en línea, si el código es realmente sensible, revísalo antes de pegarlo.
Otras herramientas que te pueden venir bien
Objective-C a XML es solo una pieza del puzzle. Estas herramientas encajan bien con ella: