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.

  1. Abra Plugins > Plugins Admin.
  2. Na aba Available, procure “XML Tools”, marque a caixa e clique em Install. O Notepad++ reinicia.
  3. 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.

  1. 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.
  2. 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).
  3. 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

  1. Notepad++ User Manual: Plugins (consultada em 20 de outubro de 2026)
  2. XML Tools para Notepad++, README e código dos menus de morbac/xmltools no GitHub (consultada em 20 de outubro de 2026)
  3. Documentação do Visual Studio Code: Basic editing, Formatting (consultada em 20 de outubro de 2026)
  4. Visual Studio Marketplace: XML da Red Hat (consultada em 20 de outubro de 2026)
  5. Documentação do vscode-xml: Formatting (consultada em 20 de outubro de 2026)
  6. libxml2: página de manual do xmllint (consultada em 20 de outubro de 2026)
  7. Pacotes do Debian: libxml2-utils (consultada em 20 de outubro de 2026)
  8. Documentação do Python: xml.dom.minidom (consultada em 20 de outubro de 2026)
  9. Documentação do Python: xml.etree.ElementTree, indent() (consultada em 20 de outubro de 2026)
  10. FAQ do lxml: Why doesn't the pretty_print option reformat my XML output? (consultada em 20 de outubro de 2026)
  11. 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)