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:
&,<. - 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 colunaimport 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;; o mesmo vale para < (&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