Ferramentas / Validador de XML

Validador de XML

Cole um XML e veja na hora se ele está bem formado. Se houver erro, mostramos a linha e a coluna.


Processamento local: nada do que você digita sai do seu navegador.

Como usar

Cole o XML na caixa. A verificação roda a cada tecla, usando o interpretador de XML do próprio navegador (DOMParser). Quando há erro, a mensagem indica a linha e a coluna, e mostramos o trecho com um marcador no ponto do problema.

O que significa "bem formado"

  • Existe um único elemento raiz.
  • Toda tag aberta é fechada, na ordem certa (<a><b></b></a>).
  • Valores de atributo estão entre aspas.
  • Caracteres especiais aparecem como entidades: &amp;, &lt;.
  • XML diferencia maiúsculas de minúsculas.

Esta ferramenta confere a sintaxe, não valida o conteúdo contra um XSD ou DTD. O texto da mensagem de erro varia um pouco entre navegadores.

Como implementar em código

Exemplos prontos para usar no seu projeto.

// No navegador (Node não tem DOMParser; use o pacote fast-xml-parser ou xmldom)
function validarXml(texto) {
  const doc = new DOMParser().parseFromString(texto, 'application/xml');
  const erro = doc.querySelector('parsererror');
  return erro ? erro.textContent.trim() : null; // null = bem formado
}

console.log(validarXml('<a><b>ok</b></a>'));  // null
console.log(validarXml('<a><b></a>'));        // mensagem com linha e coluna
import xml.etree.ElementTree as ET

def validar_xml(texto: str):
    try:
        ET.fromstring(texto)
        return None
    except ET.ParseError as e:
        linha, coluna = e.position      # (linha, coluna) do erro
        return f"linha {linha}, coluna {coluna}: {e}"

print(validar_xml("<a><b>ok</b></a>"))  # None
print(validar_xml("<a><b></a>"))        # linha 1, coluna 8: mismatched tag...

Para dados não confiáveis, prefira o pacote defusedxml (protege contra ataques de entidades).

package main

import (
	"encoding/xml"
	"fmt"
	"io"
	"strings"
)

func validarXML(texto string) error {
	d := xml.NewDecoder(strings.NewReader(texto))
	for {
		_, err := d.Token()          // percorre todos os tokens
		if err == io.EOF {
			return nil
		}
		if err != nil {
			if se, ok := err.(*xml.SyntaxError); ok {
				return fmt.Errorf("linha %d: %s", se.Line, se.Msg)
			}
			return err
		}
	}
}

func main() {
	fmt.Println(validarXML("<a><b>ok</b></a>")) // <nil>
	fmt.Println(validarXML("<a><b></a>"))       // linha 1: element <b> closed by </a>
}

O Decoder do Go não exige um único elemento raiz; confira isso à parte se precisar.

// pubspec.yaml: dependencies: xml: ^6.0.0   (a biblioteca padrão do Dart não tem parser XML)
import 'package:xml/xml.dart';

String? validarXml(String texto) {
  try {
    XmlDocument.parse(texto);
    return null; // bem formado
  } on XmlParserException catch (e) {
    return 'linha ${e.line}, coluna ${e.column}: ${e.message}';
  }
}

void main() {
  print(validarXml('<a><b>ok</b></a>')); // null
  print(validarXml('<a><b></a>'));       // erro com linha e coluna
}
import javax.xml.parsers.DocumentBuilderFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import java.io.StringReader;

public class XmlValidator {
    static String validar(String texto) {
        try {
            var f = DocumentBuilderFactory.newInstance();
            f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // segurança (XXE)
            var b = f.newDocumentBuilder();
            b.setErrorHandler(null);                       // evita imprimir no stderr
            b.parse(new InputSource(new StringReader(texto)));
            return null;                                    // bem formado
        } catch (SAXParseException e) {
            return "linha " + e.getLineNumber() + ", coluna " + e.getColumnNumber() + ": " + e.getMessage();
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    public static void main(String[] args) {
        System.out.println(validar("<a><b>ok</b></a>")); // null
        System.out.println(validar("<a><b></a>"));       // linha 1, coluna ...
    }
}
<?php
function validarXml(string $texto): ?string {
    libxml_use_internal_errors(true);          // não emitir warnings
    $doc = simplexml_load_string($texto);
    if ($doc !== false) {
        return null;                           // bem formado
    }
    $e = libxml_get_errors()[0];
    libxml_clear_errors();
    return "linha {$e->line}, coluna {$e->column}: " . trim($e->message);
}

var_dump(validarXml('<a><b>ok</b></a>')); // NULL
echo validarXml('<a><b></a>');            // linha 1, coluna ...: Opening and ending tag mismatch...
using System;
using System.Xml.Linq;
using System.Xml;

class Program
{
    static string? Validar(string texto)
    {
        try { XDocument.Parse(texto); return null; }   // bem formado
        catch (XmlException e)
        {
            return $"linha {e.LineNumber}, coluna {e.LinePosition}: {e.Message}";
        }
    }

    static void Main()
    {
        Console.WriteLine(Validar("<a><b>ok</b></a>") ?? "bem formado");
        Console.WriteLine(Validar("<a><b></a>"));
    }
}

Perguntas frequentes

A ferramenta valida contra um XSD?

Não. Ela verifica apenas se o XML é bem formado. Validar contra um esquema (XSD) exige um validador específico.

Por que meu XML com & dá erro?

O caractere & inicia uma entidade em XML. Para usar o símbolo escreva &amp;amp;; o mesmo vale para < (&amp;lt;).

Meu XML é enviado a algum servidor?

Não. A leitura é feita inteiramente no seu navegador.

Veja também

Precisa de um sistema ou app sob medida?

A VcInova desenvolve software, aplicativos e integrações para empresas de todo o Brasil.

Fale com a VcInova