XML
XML è un formato testuale che annida tag personalizzati in un albero di dati strutturati. Sintassi, schemi, annotazioni PASCAL VOC e confronto con JSON e YAML.
XML (linguaggio di marcatura estensibile) è un formato testuale per dati strutturati, in cui tag personalizzati si annidano l'uno dentro l'altro formando un albero, come un elemento <size> contenente <width> e <height>. Il World Wide Web Consortium ha pubblicato XML 1.0 come Raccomandazione nel febbraio 1998, come sottoinsieme semplificato di SGML (linguaggio di marcatura generalizzato standard) per lo scambio di documenti e dati sul Web. A differenza di HTML, XML non ha tag predefiniti: ogni applicazione definisce i propri tag per indicare il significato dei dati, motivo per cui tanti formati di file si basano su XML, dalle immagini SVG e i feed RSS ai documenti Microsoft Office. Nell'apprendimento automatico e nella visione artificiale, XML si trova soprattutto nei file di annotazione, nei file dei modelli e nei sistemi sanitari e aziendali che forniscono dati di addestramento.
Sintassi e convalida XML#
Un documento XML ha esattamente un elemento radice. Gli elementi possono contenere testo, elementi figli e attributi scritti all'interno del tag di apertura, come in <box label="car" xtl="10">; gli spazi dei nomi dichiarati con xmlns tengono separati i tag appartenenti a vocabolari diversi. Un documento che rispetta le regole sintattiche, con tutti i tag chiusi, gli elementi annidati correttamente e i valori degli attributi tra virgolette, è ben formato; i parser devono fermarsi al primo errore di buona formazione. Un documento è anche valido quando è conforme a uno schema, scritto come Document Type Definition (DTD) o XML Schema (XSD), che elenca gli elementi consentiti, il loro ordine e i tipi di dati. Espressioni XPath come size/width selezionano nodi dall'albero e i fogli di stile XSLT trasformano un vocabolario XML in un altro.
XML nella visione artificiale e nell'apprendimento automatico#
La sfida PASCAL VOC, tenutasi dal 2005 al 2012, ha reso XML il formato classico di annotazione per il rilevamento di oggetti. Ogni immagine ha un file XML con il nome e le dimensioni del file e un elemento <object> per ogni oggetto, contenente il nome della classe, i flag truncated e difficult e un elemento <bndbox> i cui angoli in pixel xmin, ymin, xmax e ymax definiscono il riquadro di delimitazione. Lo strumento di annotazione LabelImg salva questo formato per impostazione predefinita, quindi molti dataset lo includono ancora e richiedono una conversione durante il preprocessing dei dati. L'esportazione CVAT for images 1.1 da CVAT archivia tutte le annotazioni di un'attività in un unico file XML, con riquadri scritti come attributi quali xtl, ytl, xbr e ybr.
L'XML descrive anche modelli e record. La rappresentazione intermedia OpenVINO di Intel archivia i livelli e le connessioni di una rete in un file .xml e i relativi pesi in un file .bin corrispondente; i rilevatori di volti Haar cascade preaddestrati di OpenCV sono distribuiti in formato XML. Le cartelle cliniche HL7 FHIR, che i progetti di IA clinica associano alle immagini per l'analisi di immagini mediche, possono essere scambiate in XML o JSON; i file Word ed Excel sono archivi ZIP di componenti XML letti dai sistemi di IA documentale.
Questo esempio analizza un'annotazione VOC con ElementTree integrato in Python e converte ogni riquadro nel centro, nella larghezza e nell'altezza normalizzati del formato delle etichette 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}")Stampa person 0.481 0.356 0.196 0.376 e horse 0.511 0.566 0.652 0.709: gli stessi due riquadri espressi come frazioni delle dimensioni dell'immagine, pronti per essere scritti come righe di etichette dopo i rispettivi indici di classe. Il file del dataset VOC.yaml di Ultralytics esegue automaticamente questa conversione al primo utilizzo, scaricando VOC 2007 e 2012, analizzando ogni annotazione XML con ElementTree, ignorando gli oggetti contrassegnati con difficult e scrivendo le etichette YOLO .txt per 16.551 immagini di addestramento e 4.952 di convalida.
XML, JSON e YAML a confronto#
- JSON: Oggetti, array, stringhe, numeri e valori booleani, con una sintassi più leggera di XML e una corrispondenza diretta con i dizionari Python e gli oggetti JavaScript. Lo usano le API web e le annotazioni del dataset COCO.
- YAML: usa l'indentazione invece dei tag di chiusura, supporta i commenti e, dalla versione YAML 1.2, accetta qualsiasi documento JSON; per questo è molto usato per configurazioni modificate manualmente, come i file dei dataset e dei modelli YOLO.
- XML: più prolisso, con schemi, spazi dei nomi, attributi e contenuto misto, ovvero testo con markup inline, caratteristiche adatte a documenti e organismi di standardizzazione che richiedono una convalida rigorosa.
Analisi di XML non attendibile#
La funzionalità delle entità XML consente a un documento di definire testo riutilizzabile, una possibilità sfruttata dagli aggressori. Nell'attacco «billion laughs», circa dieci definizioni di entità annidate, ognuna delle quali fa riferimento dieci volte alla precedente, espandono un file di poche centinaia di byte in gigabyte di testo. Un attacco XML external entity (XXE) dichiara un'entità che punta a un file locale o a un URL interno, inducendo un parser vulnerabile a leggere segreti nel documento o a inviare richieste dalla rete interna. Il modulo Python xml.etree.ElementTree non espande le entità esterne e genera un errore di analisi quando ne incontra una; il suo parser Expat resiste agli attacchi billion laughs dalla versione 2.4.1. Il pacchetto defusedxml va oltre e genera EntitiesForbidden per qualsiasi dichiarazione di entità, interna o esterna.










