Formatar XML no Notepad++, VS Code, xmllint e Python
O Notepad++ e o VS Code não sabem indentar XML sozinhos: cada um precisa de uma extensão gratuita, e depois basta um atalho. O xmllint e o Python fazem isso no terminal ou num script. Aqui estão os menus, atalhos e comandos para formatar XML no Notepad++, VS Code, xmllint e Python, e as duas armadilhas do Python que deixam o arquivo cheio de linhas em branco ou sem indentação nenhuma.
Qual ferramenta usar para formatar um arquivo XML?
A que você já tem aberta. Formatar, ou fazer o “pretty print”, acrescenta quebras de linha e indentação entre os elementos. Os dados não mudam, e um programa que lê o arquivo vê o mesmo documento. As quatro ferramentas abaixo dão o mesmo tipo de resultado:
- Notepad++ com o plugin XML Tools: Ctrl+Alt+Shift+B.
- VS Code com a extensão XML da Red Hat: Shift+Alt+F.
- xmllint, no Linux, no macOS ou no WSL:
xmllint --format arquivo.xml. - Python, para scripts que tratam muitos arquivos:
minidom,ElementTree.indent()ou lxml.
Todas exigem um XML bem formado. Se falta fechar uma tag, elas se recusam a formatar o arquivo e mostram um número de linha: é ali que você deve procurar.
Se você só quer ler o arquivo, talvez nem precise formatá-lo. O Chrome indenta o XML sozinho: abra o arquivo XML no Chrome e você verá uma árvore, mesmo quando o arquivo está todo numa linha só. É o caso típico do XML da nota fiscal, que costuma vir sem nenhuma quebra de linha.
Sem editor por perto? O XML Formatter indenta um arquivo no seu navegador, e o XML Validator mostra a linha e a coluna do primeiro erro (duas ferramentas gratuitas, em inglês).
Formatar XML no Notepad++ com o XML Tools
O Notepad++ não tem um formatador de XML próprio. O plugin gratuito XML Tools resolve isso.
- Abra Plugins > Plugins Admin.
- Na aba Available, procure “XML Tools”, marque a caixa e clique em Install. O Notepad++ reinicia.
- Abra o arquivo XML e escolha Plugins > XML Tools > Pretty print, ou pressione Ctrl+Alt+Shift+B.
O mesmo menu tem variações. Pretty print - indent attributes (Ctrl+Alt+Shift+A) também coloca cada atributo na própria linha, o que ajuda com elementos longos, como um caminho SVG ou uma entrada de configuração. Pretty print - indent only corrige a indentação sem acrescentar quebras de linha. Linearize (Ctrl+Alt+Shift+L) faz o contrário: volta o documento inteiro para uma linha só, útil antes de colar XML num teste ou numa string.
Se o atalho parece não fazer nada, rode Plugins > XML Tools > Check XML syntax now: ele aponta o primeiro erro do arquivo. E se o XML Tools não aparece no Plugins Admin, o README dele descreve a instalação manual: crie uma pasta XMLTools dentro da pasta plugins do Notepad++, copie para ela o XMLTools.dll e reinicie.
Indentar XML no VS Code com a extensão XML
O VS Code formata JavaScript, TypeScript, JSON, HTML e CSS sem instalar nada, mas não XML. Se você roda Format Document num arquivo XML sem extensão, o VS Code avisa que não há nenhum formatador instalado para arquivos XML.
- Abra a visualização de extensões (Ctrl+Shift+X), procure “XML” e instale XML da Red Hat. Desde a versão 0.15, ela funciona sem Java.
- Abra o arquivo e pressione Shift+Alt+F no Windows, Shift+Option+F no macOS ou Ctrl+Shift+I no Linux. Format Document também está na paleta de comandos (Ctrl+Shift+P).
- Para formatar só um trecho, selecione-o e use Format Selection (Ctrl+K Ctrl+F).
Se outra extensão instalada também formata XML, o VS Code pergunta qual usar. Para fixar essa escolha, definir a indentação só para XML e formatar a cada salvamento, acrescente isto ao seu settings.json:
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml",
"editor.tabSize": 2,
"editor.formatOnSave": true
}
A extensão da Red Hat pega a indentação de editor.tabSize e editor.insertSpaces. As configurações próprias dela começam com xml.format.: xml.format.splitAttributes decide se os atributos vão em linhas separadas, e xml.format.maxLineWidth define a largura máxima da linha, 100 caracteres por padrão, ou sem limite com 0.
Formatar XML na linha de comando com o xmllint
O xmllint vem com a libxml2. O macOS já traz. No Debian e no Ubuntu ele está no pacote libxml2-utils, e no Windows o caminho mais simples é o WSL, com o mesmo comando:
sudo apt install libxml2-utils
Depois:
xmllint --format entrada.xml # mostra o XML formatado
xmllint --format --output limpo.xml entrada.xml # grava num arquivo novo
curl -s https://example.com/sitemap.xml | xmllint --format - # lê de um pipe
Não rode xmllint --format arquivo.xml > arquivo.xml: o shell esvazia o arquivo antes de o xmllint ler, e você perde o conteúdo. Grave num arquivo novo e depois renomeie.
A indentação padrão é de dois espaços. A variável de ambiente XMLLINT_INDENT muda isso:
XMLLINT_INDENT=" " xmllint --format entrada.xml # quatro espaços
XMLLINT_INDENT=$'\t' xmllint --format entrada.xml # tabulações, no bash
O --format descarta os espaços que já existem entre os elementos antes de indentar de novo, então um arquivo mal indentado à mão sai limpo. Quando o XML não está bem formado, o xmllint mostra o nome do arquivo, a linha e o erro, e termina com um código diferente de zero. Por isso ele serve de verificação num script ou numa pipeline de CI. Para checar um arquivo sem exibi-lo, use xmllint --noout entrada.xml.
Indentar XML no Python: minidom, ElementTree e lxml
Na biblioteca padrão, o jeito mais rápido é o xml.dom.minidom:
from xml.dom import minidom
dom = minidom.parse("entrada.xml")
print(dom.toprettyxml(indent=" "))
Ele tem duas armadilhas. Num arquivo que já tem quebras de linha, toprettyxml() mantém os espaços antigos e acrescenta os seus, e aparecem linhas em branco entre os elementos. No nosso teste com o Python 3.14, um arquivo pequeno já indentado saiu com linhas em branco em volta de cada filho da raiz. E sem o argumento encoding, a declaração que ele escreve não informa a codificação: <?xml version="1.0" ?>. Passe encoding="UTF-8" para receber bytes com a codificação declarada.
Desde o Python 3.9, xml.etree.ElementTree.indent() evita a primeira armadilha, porque substitui os espaços entre os elementos em vez de acrescentar outros:
import xml.etree.ElementTree as ET
tree = ET.parse("entrada.xml")
ET.indent(tree, space=" ")
tree.write("limpo.xml", encoding="UTF-8", xml_declaration=True)
Com o lxml (pip install lxml), pretty_print=True só indenta os elementos que ainda não têm espaços em volta. O FAQ do lxml explica o motivo e dá a solução: ler o arquivo com remove_blank_text=True.
from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse("entrada.xml", parser)
tree.write("limpo.xml", pretty_print=True, xml_declaration=True, encoding="UTF-8")
Sem essa opção, nosso arquivo de teste manteve o elemento numa linha só. O lxml também é a biblioteca dos nossos exemplos de XSLT no servidor com Python: um script que transforma arquivos pode formatar o resultado na mesma passada.
Ler um arquivo XML longo sem reformatar
Formatar serve para editar e para ter diffs limpos no Git. Para ler um arquivo longo, uma visualização que recolhe a estrutura costuma ser mais rápida do que rolar milhares de linhas indentadas, e não mexe no arquivo.
O Chrome mostra arquivos XML locais e on-line como uma árvore indentada, sem configurar nada. O XMLNest, visualizador de XML para Chrome, disponível na Chrome Web Store, acrescenta recolher e expandir nós, busca nos nomes e nos valores, uma visualização do código-fonte com números de linha, e a linha e a coluna do erro quando um arquivo está quebrado. Assim você sabe onde olhar antes de abrir o arquivo no Notepad++ ou no VS Code para corrigir.
Fontes
- Notepad++ User Manual: Plugins (consultada em 20 de outubro de 2026)
- XML Tools para Notepad++, README e código dos menus de morbac/xmltools no GitHub (consultada em 20 de outubro de 2026)
- Documentação do Visual Studio Code: Basic editing, Formatting (consultada em 20 de outubro de 2026)
- Visual Studio Marketplace: XML da Red Hat (consultada em 20 de outubro de 2026)
- Documentação do vscode-xml: Formatting (consultada em 20 de outubro de 2026)
- libxml2: página de manual do xmllint (consultada em 20 de outubro de 2026)
- Pacotes do Debian: libxml2-utils (consultada em 20 de outubro de 2026)
- Documentação do Python: xml.dom.minidom (consultada em 20 de outubro de 2026)
- Documentação do Python: xml.etree.ElementTree, indent() (consultada em 20 de outubro de 2026)
- FAQ do lxml: Why doesn't the pretty_print option reformat my XML output? (consultada em 20 de outubro de 2026)
- Teste do XMLNest : Testado pelo XMLNest em 20 de outubro de 2026 com Python 3.14.3 e lxml 6.0.2, num arquivo cuja raiz tinha um elemento filho escrito numa única linha sob uma indentação existente: toprettyxml(indent=" ") do minidom acrescentou linhas em branco em volta do filho e escreveu <?xml version="1.0" ?> sem codificação; ElementTree.indent() deu uma indentação limpa de dois espaços; o lxml com pretty_print=True deixou o filho numa linha e o indentou depois que o arquivo foi lido com remove_blank_text=True (consultada em 20 de outubro de 2026)