XML
XML ist ein Textformat, das benutzerdefinierte Tags zu einer Baumstruktur verschachtelter Daten zusammenfügt. Behandelt werden Syntax, Schemas, PASCAL-VOC-Annotationen und der Vergleich mit JSON und YAML.
XML (Auszeichnungssprache) ist ein Textformat für strukturierte Daten, in dem benutzerdefinierte Tags ineinander verschachtelt werden und so einen Baum bilden. Ein Element wie <size> kann etwa <width> und <height> enthalten. Das World Wide Web Consortium veröffentlichte XML 1.0 im Februar 1998 als Empfehlung: eine vereinfachte Teilmenge von SGML (Standard Generalized Markup Language) zum Austausch von Dokumenten und Daten im Web. Anders als HTML verfügt XML über keine vordefinierten Tags. Jede Anwendung legt eigene Tags für die Bedeutung ihrer Daten fest. Deshalb basieren zahlreiche Dateiformate darauf, von SVG-Grafiken und RSS-Feeds bis hin zu Microsoft-Office-Dokumenten. Beim maschinellen Lernen und in der Computer Vision kommt XML vor allem in Annotations- und Modelldateien sowie in Systemen aus dem Gesundheitswesen und der Wirtschaft zum Einsatz, die Trainingsdaten bereitstellen.
XML-Syntax und -Validierung#
Ein XML-Dokument hat genau ein Wurzelelement. Elemente können Text, untergeordnete Elemente und Attribute enthalten, die wie in <box label="car" xtl="10"> im öffnenden Tag stehen. Mit xmlns deklarierte Namensräume halten Tags aus verschiedenen Vokabularen voneinander getrennt. Ein Dokument ist wohlgeformt, wenn es die Syntaxregeln erfüllt, alle Tags geschlossen und Elemente korrekt verschachtelt sind und Attributwerte in Anführungszeichen stehen. Parser müssen beim ersten Wohlgeformtheitsfehler abbrechen. Ein Dokument ist außerdem gültig, wenn es einem Schema entspricht. Dieses wird als Document Type Definition (DTD) oder XML Schema (XSD) geschrieben und führt die zulässigen Elemente, deren Reihenfolge und Datentypen auf. XPath-Ausdrücke wie size/width wählen Knoten aus dem Baum aus, und XSLT-Stylesheets wandeln ein XML-Vokabular in ein anderes um.
XML in Computer Vision und maschinellem Lernen#
Der Wettbewerb PASCAL VOC, der von 2005 bis 2012 stattfand, machte XML zum klassischen Annotationsformat für die Objekterkennung. Zu jedem Bild gehört eine XML-Datei mit Dateiname und Größe sowie einem Element <object> pro Objekt. Dieses enthält den Klassennamen, die Kennzeichnungen truncated und difficult sowie ein Element <bndbox>, dessen Pixelecken xmin, ymin, xmax und ymax die Bounding Box festlegen. Das Annotationstool LabelImg speichert standardmäßig in diesem Format. Deshalb wird es noch immer mit vielen Datensätzen ausgeliefert und muss bei der Datenvorverarbeitung umgewandelt werden. Der CVAT-Export für Bilder 1.1 aus CVAT speichert alle Annotationen einer Aufgabe in einer einzelnen XML-Datei. Die Boxen werden als Attribute wie xtl, ytl, xbr und ybr angegeben.
XML beschreibt auch Modelle und Datensätze. Die Zwischenrepräsentation OpenVINO von Intel speichert die Schichten und Verbindungen eines Netzes in einer .xml-Datei und dessen Gewichte in einer entsprechenden .bin-Datei. Die vortrainierten Haar-Kaskaden-Gesichtsdetektoren von OpenCV werden ebenfalls als XML verteilt. HL7-FHIR-Gesundheitsdaten, die Projekte der klinischen KI mit Bildern zur medizinischen Bildanalyse kombinieren, lassen sich als XML oder JSON austauschen. Word- und Excel-Dateien sind ZIP-Archive mit XML-Bestandteilen, die Dokumentenverarbeitungssysteme für KI auslesen.
Dieses Beispiel liest eine VOC-Annotation mit Pythons integrierter ElementTree-Bibliothek ein und wandelt jede Box in den normalisierten Mittelpunkt, die Breite und die Höhe des YOLO-Beschriftungsformats um:
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}")Das Beispiel gibt person 0.481 0.356 0.196 0.376 und horse 0.511 0.566 0.652 0.709 aus: dieselben zwei Boxen als Anteile der Bildgröße, bereit, nach ihren Klassenindizes als Beschriftungszeilen gespeichert zu werden. Die Ultralytics-Datensatzdatei VOC.yaml führt diese Umwandlung bei der ersten Verwendung automatisch aus. Sie lädt VOC 2007 und 2012 herunter, liest jede XML-Annotation mit ElementTree ein, überspringt Objekte mit der Kennzeichnung difficult und schreibt YOLO-Beschriftungen im Format .txt für 16.551 Trainings- und 4.952 Validierungsbilder.
XML im Vergleich zu JSON und YAML#
- JSON: Objekte, Arrays, Zeichenfolgen, Zahlen und boolesche Werte mit einer einfacheren Syntax als XML und einer direkten Zuordnung zu Python-Wörterbüchern und JavaScript-Objekten. Web-APIs und die COCO-Datensatzannotationen verwenden dieses Format.
- YAML: Einrückungen statt schließender Tags, Unterstützung für Kommentare und eine Syntax, die seit YAML 1.2 jedes JSON-Dokument akzeptiert. Dadurch eignet sich YAML besonders für manuell bearbeitete Konfigurationen wie YOLO-Datensatz- und Modelldateien.
- XML: Ausführlicher, mit Schemas, Namensräumen, Attributen und gemischten Inhalten, also Text mit eingebetteter Auszeichnung. Das eignet sich für Dokumente und Standardisierungsgremien, die eine strenge Validierung benötigen.
Nicht vertrauenswürdiges XML verarbeiten#
Mit der Entitätsfunktion von XML lassen sich wiederverwendbare Textbausteine in einem Dokument definieren, doch Angreifer nutzen diese Funktion aus. Beim „Billion-Laughs“-Angriff verweisen etwa zehn verschachtelte Entitätsdefinitionen jeweils zehnmal auf die vorherige Definition. Dadurch wird eine Datei mit wenigen Hundert Bytes auf mehrere Gigabyte Text aufgebläht. Bei einem XML-External-Entity-Angriff (XXE) wird eine Entität definiert, die auf eine lokale Datei oder eine interne URL verweist. Ein anfälliger Parser liest dann vertrauliche Daten in das Dokument ein oder sendet Anfragen innerhalb des Netzwerks. Pythons xml.etree.ElementTree löst keine externen Entitäten auf und gibt beim Auftreten einer solchen Entität einen Analysefehler aus. Ab Version 2.4.1 ist der Expat-Parser gegen Billion-Laughs-Angriffe geschützt. Das Paket defusedxml geht noch weiter und gibt bei jeder Entitätsdeklaration, ob intern oder extern, einen Fehler EntitiesForbidden aus.










