Formatear XML en Notepad++, VS Code, xmllint y Python

Notepad++ y VS Code no saben indentar XML por sí solos: cada uno necesita una extensión gratuita, y después basta con un atajo. xmllint y Python lo hacen desde la terminal o desde un script. Aquí tienes los menús, atajos y comandos para formatear XML en Notepad++, VS Code, xmllint y Python, y las dos trampas de Python que dejan un archivo lleno de líneas en blanco o sin indentar.

¿Qué herramienta usar para formatear un archivo XML?

La que ya tengas abierta. Formatear, o hacer un «pretty print», añade saltos de línea e indentación entre los elementos. Los datos no cambian, y un programa que lea el archivo ve el mismo documento. Las cuatro herramientas de abajo dan el mismo tipo de resultado:

  • Notepad++ con el plugin XML Tools: Ctrl+Alt+Mayús+B.
  • VS Code con la extensión XML de Red Hat: Mayús+Alt+F.
  • xmllint, en Linux, macOS o WSL: xmllint --format archivo.xml.
  • Python, para scripts que procesan muchos archivos: minidom, ElementTree.indent() o lxml.

Todas exigen un XML bien formado. Si falta cerrar una etiqueta, se niegan a formatear el archivo y te dan un número de línea: ahí es donde hay que buscar.

Si solo quieres leer el archivo, quizá no necesites formatearlo. Chrome indenta el XML por su cuenta: abre el archivo XML en Chrome y verás un árbol, aunque el archivo esté en una sola línea.

¿No tienes un editor a mano? El XML Formatter sangra un archivo en tu navegador, y el XML Validator indica la línea y la columna del primer error (dos herramientas gratuitas, en inglés).

Formatear XML en Notepad++ con XML Tools

Notepad++ no trae un formateador de XML. El plugin gratuito XML Tools lo añade.

  1. Abre Plugins > Plugins Admin.
  2. En la pestaña Available, busca «XML Tools», márcalo y pulsa Install. Notepad++ se reinicia.
  3. Abre tu archivo XML y elige Plugins > XML Tools > Pretty print, o pulsa Ctrl+Alt+Mayús+B.

El mismo menú tiene variantes. Pretty print - indent attributes (Ctrl+Alt+Mayús+A) además pone cada atributo en su propia línea, útil con elementos largos como un trazado SVG o una entrada de configuración. Pretty print - indent only corrige la indentación sin añadir saltos de línea. Linearize (Ctrl+Alt+Mayús+L) hace lo contrario: vuelve a poner todo el documento en una línea, práctico antes de pegar XML en una prueba o en una cadena de texto.

Si el atajo parece no hacer nada, ejecuta Plugins > XML Tools > Check XML syntax now: indica el primer error del archivo. Y si XML Tools no aparece en Plugins Admin, su README explica la instalación manual: crea una carpeta XMLTools dentro de la carpeta plugins de Notepad++, copia en ella XMLTools.dll y reinicia.

Indentar XML en VS Code con la extensión XML

VS Code formatea JavaScript, TypeScript, JSON, HTML y CSS sin instalar nada, pero no XML. Si lanzas Format Document sobre un archivo XML sin extensión, VS Code te avisa de que no hay ningún formateador instalado para archivos XML.

  1. Abre la vista de extensiones (Ctrl+Mayús+X), busca «XML» e instala XML de Red Hat. Desde la versión 0.15 funciona sin Java.
  2. Abre tu archivo y pulsa Mayús+Alt+F en Windows, Mayús+Opción+F en macOS o Ctrl+Mayús+I en Linux. Format Document también está en la paleta de comandos (Ctrl+Mayús+P).
  3. Para formatear solo una parte del archivo, selecciónala y usa Format Selection (Ctrl+K Ctrl+F).

Si otra extensión instalada también formatea XML, VS Code te pregunta cuál usar. Para fijar esa elección, ajustar la indentación solo para XML y formatear al guardar, añade esto a tu settings.json:

"[xml]": {
  "editor.defaultFormatter": "redhat.vscode-xml",
  "editor.tabSize": 2,
  "editor.formatOnSave": true
}

La extensión de Red Hat toma la indentación de editor.tabSize y editor.insertSpaces. Sus propios ajustes empiezan por xml.format.: xml.format.splitAttributes decide si los atributos van en líneas separadas, y xml.format.maxLineWidth fija el ancho máximo de línea, 100 caracteres por defecto, o sin límite con 0.

Formatear XML en la línea de comandos con xmllint

xmllint viene con libxml2. macOS ya lo incluye. En Debian y Ubuntu está en el paquete libxml2-utils, y en Windows lo más sencillo es usar WSL con el mismo comando:

sudo apt install libxml2-utils

Después:

xmllint --format entrada.xml                          # muestra el XML formateado
xmllint --format --output limpio.xml entrada.xml      # lo escribe en un archivo nuevo
curl -s https://example.com/sitemap.xml | xmllint --format -   # lee desde una tubería

No escribas xmllint --format archivo.xml > archivo.xml: la shell vacía el archivo antes de que xmllint lo lea, y lo pierdes. Escribe en un archivo nuevo y luego renómbralo.

La indentación es de dos espacios por defecto. La variable de entorno XMLLINT_INDENT la cambia:

XMLLINT_INDENT="    " xmllint --format entrada.xml   # cuatro espacios
XMLLINT_INDENT=$'\t' xmllint --format entrada.xml    # tabulaciones, en bash

--format descarta los espacios que ya hay entre los elementos antes de volver a indentar, así que un archivo mal indentado a mano sale limpio. Cuando el XML no está bien formado, xmllint muestra el nombre del archivo, la línea y el error, y termina con un código distinto de cero. Por eso sirve como comprobación en un script o en integración continua. Para comprobar un archivo sin mostrarlo, usa xmllint --noout entrada.xml.

Indentar XML en Python: minidom, ElementTree y lxml

En la biblioteca estándar, lo más rápido es xml.dom.minidom:

from xml.dom import minidom

dom = minidom.parse("entrada.xml")
print(dom.toprettyxml(indent="  "))

Tiene dos trampas. En un archivo que ya tiene saltos de línea, toprettyxml() conserva los espacios antiguos y añade los suyos, y aparecen líneas en blanco entre los elementos. En nuestra prueba con Python 3.14, un pequeño archivo ya indentado salió con líneas en blanco alrededor de cada hijo de la raíz. Y sin el argumento encoding, la declaración que escribe no indica la codificación: <?xml version="1.0" ?>. Pasa encoding="UTF-8" para obtener bytes con la codificación declarada.

Desde Python 3.9, xml.etree.ElementTree.indent() evita la primera trampa, porque sustituye los espacios entre elementos en lugar de añadir más:

import xml.etree.ElementTree as ET

tree = ET.parse("entrada.xml")
ET.indent(tree, space="  ")
tree.write("limpio.xml", encoding="UTF-8", xml_declaration=True)

Con lxml (pip install lxml), pretty_print=True solo indenta los elementos que todavía no tienen espacios alrededor. La FAQ de lxml explica el motivo y da la solución: leer el archivo con remove_blank_text=True.

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse("entrada.xml", parser)
tree.write("limpio.xml", pretty_print=True, xml_declaration=True, encoding="UTF-8")

Sin esa opción, nuestro archivo de prueba conservó su elemento en una sola línea. lxml es también la biblioteca de nuestros ejemplos de XSLT en el servidor con Python: un script que transforma archivos puede formatear el resultado en la misma pasada.

Leer un archivo XML largo sin reformatearlo

Formatear sirve para editar y para tener diferencias limpias en Git. Para leer un archivo largo, una vista que pliega la estructura suele ser más rápida que desplazarse por miles de líneas indentadas, y no toca el archivo.

Chrome muestra los archivos XML locales y en línea como un árbol indentado, sin configurar nada. XMLNest, visor de XML para Chrome, disponible en Chrome Web Store, añade plegado, búsqueda en nombres y valores, una vista de código fuente con números de línea, y la línea y la columna del error cuando un archivo está roto. Así sabes dónde mirar antes de abrir el archivo en Notepad++ o VS Code para corregirlo.

Fuentes

  1. Notepad++ User Manual: Plugins (consultada el 20 de octubre de 2026)
  2. XML Tools para Notepad++, README y código de los menús de morbac/xmltools en GitHub (consultada el 20 de octubre de 2026)
  3. Documentación de Visual Studio Code: Basic editing, Formatting (consultada el 20 de octubre de 2026)
  4. Visual Studio Marketplace: XML de Red Hat (consultada el 20 de octubre de 2026)
  5. Documentación de vscode-xml: Formatting (consultada el 20 de octubre de 2026)
  6. libxml2: página de manual de xmllint (consultada el 20 de octubre de 2026)
  7. Paquetes de Debian: libxml2-utils (consultada el 20 de octubre de 2026)
  8. Documentación de Python: xml.dom.minidom (consultada el 20 de octubre de 2026)
  9. Documentación de Python: xml.etree.ElementTree, indent() (consultada el 20 de octubre de 2026)
  10. FAQ de lxml: Why doesn't the pretty_print option reformat my XML output? (consultada el 20 de octubre de 2026)
  11. Prueba de XMLNest : Probado por XMLNest el 20 de octubre de 2026 con Python 3.14.3 y lxml 6.0.2, en un archivo cuya raíz tenía un elemento hijo escrito en una sola línea bajo una indentación existente: toprettyxml(indent=" ") de minidom añadió líneas en blanco alrededor del hijo y escribió <?xml version="1.0" ?> sin codificación; ElementTree.indent() dio una indentación limpia de dos espacios; lxml con pretty_print=True dejó el hijo en una línea y lo indentó una vez leído el archivo con remove_blank_text=True (consultada el 20 de octubre de 2026)