XML
XML es un formato de texto que anida etiquetas personalizadas en un árbol de datos estructurados. Explica su sintaxis, esquemas, anotaciones PASCAL VOC y comparación con JSON y YAML.
XML (Lenguaje de marcado extensible) es un formato de texto para datos estructurados en el que las etiquetas personalizadas se anidan unas dentro de otras para formar un árbol; por ejemplo, un elemento <size> que contiene <width> y <height>. El Consorcio World Wide Web publicó XML 1.0 como Recomendación en febrero de 1998, como subconjunto simplificado de SGML (Lenguaje de marcado generalizado estándar) para intercambiar documentos y datos en la web. A diferencia de HTML, XML no tiene etiquetas predefinidas: cada aplicación define sus propias etiquetas para expresar el significado de sus datos, por lo que muchos formatos de archivo se basan en XML, desde gráficos SVG y fuentes RSS hasta documentos de Microsoft Office. En el aprendizaje automático y la visión artificial, XML aparece sobre todo en archivos de anotaciones, archivos de modelos y sistemas sanitarios y empresariales que proporcionan datos de entrenamiento.
Sintaxis y validación de XML#
Un documento XML tiene exactamente un elemento raíz. Los elementos pueden contener texto, elementos secundarios y atributos escritos dentro de la etiqueta de apertura, como en <box label="car" xtl="10">; los espacios de nombres declarados con xmlns mantienen separadas las etiquetas de distintos vocabularios. Un documento que respeta las reglas sintácticas, con todas las etiquetas cerradas, los elementos bien anidados y los valores de los atributos entre comillas, está bien formado; los analizadores deben detenerse ante el primer error de formato. Un documento también es válido si se ajusta a un esquema, redactado como una definición de tipo de documento (DTD) o un esquema XML (XSD) que enumera los elementos permitidos, su orden y sus tipos de datos. Las expresiones XPath, como size/width, seleccionan nodos del árbol, y las hojas de estilo XSLT transforman un vocabulario XML en otro.
XML en visión artificial y aprendizaje automático#
El certamen PASCAL VOC, celebrado entre 2005 y 2012, convirtió XML en el formato clásico de anotación para la detección de objetos. Cada imagen tiene un archivo XML con su nombre y tamaño, y un elemento <object> por objeto, que contiene el nombre de la clase, los indicadores truncated y difficult, y un elemento <bndbox> cuyas esquinas en píxeles xmin, ymin, xmax y ymax definen la caja delimitadora. La herramienta de anotación LabelImg guarda este formato de forma predeterminada, así que muchos conjuntos de datos todavía lo incluyen y hay que convertirlos durante el preprocesamiento de datos. La exportación CVAT for images 1.1 de CVAT guarda todas las anotaciones de una tarea en un único archivo XML, con cajas definidas por atributos como xtl, ytl, xbr y ybr.
XML también describe modelos y registros. La representación intermedia de OpenVINO de Intel almacena las capas y conexiones de una red en un archivo .xml y sus pesos en un archivo .bin correspondiente; los detectores faciales en cascada de Haar preentrenados de OpenCV se distribuyen en formato XML. Los registros sanitarios HL7 FHIR, que los proyectos de IA clínica combinan con imágenes para el análisis de imágenes médicas, se pueden intercambiar en XML o JSON. Los archivos de Word y Excel son archivos ZIP con componentes XML que leen los sistemas de IA documental.
Este ejemplo analiza una anotación VOC con ElementTree, la biblioteca integrada de Python, y convierte cada caja al centro, ancho y alto normalizados del formato de etiquetas YOLO:
import xml.etree.ElementTree as ET
# A PASCAL VOC annotation: one XML file per image, one <object> per box
voc = """
<annotation>
<filename>000017.jpg</filename>
<size><width>480</width><height>364</height><depth>3</depth></size>
<object><name>person</name><difficult>0</difficult>
<bndbox><xmin>185</xmin><ymin>62</ymin><xmax>279</xmax><ymax>199</ymax></bndbox></object>
<object><name>horse</name><difficult>0</difficult>
<bndbox><xmin>90</xmin><ymin>78</ymin><xmax>403</xmax><ymax>336</ymax></bndbox></object>
</annotation>
"""
root = ET.fromstring(voc)
w, h = int(root.find("size/width").text), int(root.find("size/height").text)
# Convert corner pixels to YOLO's normalized center x, center y, width, height
for obj in root.iter("object"):
box = obj.find("bndbox")
x1, y1, x2, y2 = (float(box.find(k).text) for k in ("xmin", "ymin", "xmax", "ymax"))
cx, cy = ((x1 + x2) / 2 - 1) / w, ((y1 + y2) / 2 - 1) / h # VOC pixel indices start at 1
print(obj.find("name").text, f"{cx:.3f} {cy:.3f} {(x2 - x1) / w:.3f} {(y2 - y1) / h:.3f}")Imprime person 0.481 0.356 0.196 0.376 y horse 0.511 0.566 0.652 0.709: las mismas dos cajas expresadas como fracciones del tamaño de la imagen, listas para escribirse como líneas de etiquetas después de los índices de clase. El archivo de conjunto de datos VOC.yaml de Ultralytics realiza automáticamente esta conversión la primera vez que se usa: descarga VOC 2007 y 2012, analiza todas las anotaciones XML con ElementTree, omite los objetos marcados con difficult y escribe etiquetas YOLO .txt para 16 551 imágenes de entrenamiento y 4952 de validación.
XML frente a JSON y YAML#
- JSON: Objetos, matrices, cadenas, números y valores booleanos, con una sintaxis más ligera que XML y una correspondencia directa con los diccionarios de Python y los objetos de JavaScript. Las API web y las anotaciones del conjunto de datos COCO lo utilizan.
- YAML: utiliza la sangría en lugar de etiquetas de cierre, admite comentarios y, desde YAML 1.2, acepta cualquier documento JSON. Por eso es popular para editar a mano archivos de configuración, como los archivos de conjuntos de datos y modelos de YOLO.
- XML: es más verboso e incluye esquemas, espacios de nombres, atributos y contenido mixto, es decir, texto con marcado en línea; por eso resulta adecuado para documentos y organismos de normalización que requieren una validación estricta.
Análisis de XML no confiable#
La función de entidades de XML permite definir texto reutilizable en un documento, y los atacantes se aprovechan de ello. En el ataque «Billion Laughs», unas diez definiciones de entidades anidadas, cada una de las cuales hace referencia a la anterior diez veces, expanden un archivo de unos cientos de bytes hasta convertirlo en gigabytes de texto. Un ataque de entidad externa XML (XXE) declara una entidad que apunta a un archivo local o una URL interna, de modo que un analizador vulnerable lee secretos en el documento o envía solicitudes desde dentro de la red. xml.etree.ElementTree de Python no expande entidades externas y genera un error de análisis al encontrar una; además, su analizador Expat resiste el ataque Billion Laughs desde la versión 2.4.1. El paquete defusedxml va más allá y genera EntitiesForbidden ante cualquier declaración de entidad, interna o externa.










