XML
XML é um formato de texto que aninha etiquetas personalizadas numa árvore de dados estruturados. A sua sintaxe, esquemas, anotações PASCAL VOC e comparação com JSON e YAML.
XML (Linguagem de Marcação Extensível) é um formato de texto para dados estruturados, no qual etiquetas personalizadas se aninham umas dentro das outras para formar uma árvore, como um elemento <size> que contém <width> e <height>. O World Wide Web Consortium publicou o XML 1.0 como Recomendação em fevereiro de 1998, enquanto subconjunto simplificado de SGML (Linguagem de Marcação Generalizada Padrão) para intercâmbio de documentos e dados na Web. Ao contrário do HTML, o XML não tem etiquetas predefinidas: cada aplicação define as suas próprias etiquetas para indicar o significado dos dados, razão pela qual tantos formatos de ficheiro se baseiam nele, desde gráficos SVG e feeds RSS a documentos do Microsoft Office. Na aprendizagem automática e na visão computacional, o XML surge sobretudo em ficheiros de anotação, ficheiros de modelos e sistemas de saúde e empresariais que fornecem dados de treino.
Sintaxe e validação de XML#
Um documento XML tem exatamente um elemento raiz. Os elementos podem conter texto, elementos subordinados e atributos escritos na etiqueta de abertura, como em <box label="car" xtl="10">, e os espaços de nomes declarados com xmlns mantêm separadas as etiquetas de vocabulários diferentes. Um documento que respeite as regras de sintaxe, com todas as etiquetas fechadas, elementos corretamente aninhados e valores de atributos entre aspas, é bem formado, e os analisadores têm de parar no primeiro erro de boa formação. Um documento também é válido quando corresponde a um esquema, escrito como uma Definição de Tipo de Documento (DTD) ou um Esquema XML (XSD), que enumera os elementos permitidos, a respetiva ordem e os tipos de dados. Expressões XPath como size/width selecionam nós da árvore, e folhas de estilo XSLT transformam um vocabulário XML noutro.
XML na visão computacional e na aprendizagem automática#
O desafio PASCAL VOC, realizado entre 2005 e 2012, tornou o XML o formato clássico de anotação para a deteção de objetos. Cada imagem tem um ficheiro XML com o nome e as dimensões do ficheiro e um elemento <object> por objeto, que contém o nome da classe, as flags truncated e difficult, e um elemento <bndbox> cujos cantos em píxeis xmin, ymin, xmax e ymax definem a caixa delimitadora. A ferramenta de anotação LabelImg guarda este formato por predefinição, por isso muitos conjuntos de dados ainda o incluem e precisam de conversão durante o pré-processamento dos dados. A exportação CVAT for images 1.1 do CVAT armazena todas as anotações de uma tarefa num único ficheiro XML, com caixas escritas como atributos, por exemplo xtl, ytl, xbr e ybr.
XML também descreve modelos e registros. A Representação Intermediária do OpenVINO da Intel armazena as camadas e conexões de uma rede em um arquivo .xml e seus pesos em um arquivo .bin correspondente; os detectores de rosto em cascata Haar pré-treinados do OpenCV são distribuídos em XML. Os registros de saúde HL7 FHIR, que projetos de IA clínica combinam com imagens para análise de imagens médicas, podem ser trocados como XML ou JSON; arquivos do Word e Excel são arquivos ZIP de partes XML que sistemas de IA leem.
Este exemplo analisa uma anotação VOC com o ElementTree integrado no Python e converte cada caixa no centro, largura e altura normalizados do 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 e horse 0.511 0.566 0.652 0.709: as mesmas duas caixas, expressas como frações do tamanho da imagem, prontas para serem escritas como linhas de rótulos após os respetivos índices de classe. O ficheiro do conjunto de dados VOC.yaml da Ultralytics executa esta conversão automaticamente na primeira utilização, transferindo os conjuntos VOC 2007 e 2012, analisando todas as anotações XML com ElementTree, ignorando os objetos marcados como difficult e escrevendo rótulos YOLO .txt para 16 551 imagens de treino e 4 952 imagens de validação.
XML versus JSON versus YAML#
- JSON: Objetos, matrizes, cadeias de caracteres, números e valores booleanos, com sintaxe mais leve que XML e mapeamento direto para dicionários Python e objetos JavaScript. APIs web e as anotações do conjunto de dados COCO usam esse formato.
- YAML: Utiliza indentação em vez de etiquetas de fecho, permite comentários e, desde o YAML 1.2, aceita qualquer documento JSON. Por isso, é popular para ficheiros de configuração editados manualmente, como os ficheiros de conjuntos de dados e modelos YOLO.
- XML: Mais verboso, com esquemas, espaços de nomes, atributos e conteúdo misto — isto é, texto com marcação integrada —, o que o torna adequado para documentos e organismos de normalização que exigem validação rigorosa.
Analisar XML não fiável#
A funcionalidade de entidades do XML permite que um documento defina texto reutilizável, e os atacantes abusam dela. No ataque «billion laughs», cerca de dez definições de entidades aninhadas, cada uma a referenciar dez vezes a anterior, expandem um ficheiro de algumas centenas de bytes para gigabytes de texto. Um ataque de entidade externa XML (XXE) declara uma entidade que aponta para um ficheiro local ou URL interno, levando um analisador vulnerável a ler segredos para o documento ou a enviar pedidos a partir do interior da rede. O xml.etree.ElementTree do Python não expande entidades externas e gera um erro de análise quando encontra uma; o respetivo analisador Expat resiste a ataques «billion laughs» desde a versão 2.4.1. O pacote defusedxml vai mais longe e gera EntitiesForbidden para qualquer declaração de entidade, interna ou externa.










