Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿minidom añade líneas vacías? Compruebe el texto antes de borrar espacios

Un XML más limpio puede contener texto distinto. Reproduzca el ciclo, compruebe la versión de Python y compare el contenido semántico antes de sustituir el original.

Diagrama original de cambios de texto por espaciosXML
Ilustración original: un análisis correcto puede ocultar saltos añadidos y líneas intencionales borradas. Watch at Ease

No borre todas las líneas vacías para arreglar un XML que crece. Demuestre qué espacios son prescindibles y si el serializador instalado modifica el texto: un documento que aún se analiza puede haber perdido significado.

1. Fije el ciclo de guardado y el entorno

Conserve el original y una copia desechable. Registre sys.version, parser, llamada de serialización, argumentos indent/newl y si la entrada ya tenía sangría. Repita el mismo ciclo de análisis, edición y serialización sin editar nada; si crece, investigue el formato en lugar del elemento nuevo.

En nuestro caso deCPython3.12.14, una raíz ya indentada con un item produjo cuatro líneas vacías tras toprettyxml(indent=' ') y ocho después de releer y volver a imprimir. Son cifras de ese pequeño ejemplo, no de cualquier XML.

2. Trate los espacios como contenido posible

El ejemplo <p>Hello <b>world</b>!</p> cambió su texto descendiente de Hello world! a texto con saltos e indentación añadidos. Otro ejemplo, <p><b>A</b> <b>B</b></p>, también alteró el separador de un espacio. Contar etiquetas o comprobar que el resultado se analiza no detectaría ninguno.

Un ejemplo con xml:space='preserve' y una línea vacía intencional también se reformateó en 3.12.14. Filtrar la salida con if line.strip() eliminó esa línea. W3C define preserve como una intención heredada por los descendientes salvo anulación. No demuestra que todo formateador instalado la implemente.

3. Elija una reparación acotada

Si desconoce el significado de los espacios en el entorno probado, serialice el DOM editado con toxml(encoding='utf-8') y escriba esos bytes en un archivo nuevo. Evita añadir sangría; no elimina los espacios existentes ni recupera texto alterado en un guardado anterior. En los cuatro casos conservó el texto descendiente analizado y el segundo ciclo de análisis y toxml produjo la misma serialización.

Separe la copia formateada para consulta del documento almacenado. Elimine nodos de presentación solo donde el modelo de contenido o contrato de la aplicación los declare ignorables. La FAQ de lxml advierte que remove_blank_text usa una heurística sin conocimiento definitivo; cambiar de biblioteca no demuestra conservación universal.

4. Acepte por significado, no por apariencia

La documentación de desarrollo de Python3.16 registra cambios para contenido mixto y xml:space='preserve'. No suponga que describe 3.12 ni que actualizar recuperará texto ya alterado. Solo ejecutamos 3.12.14: repita casos representativos en la versión exacta propuesta.

Antes de sustituir el original, vuelva a analizar el candidato y compare elementos ordenados, atributos y cada tramo de texto, incluidos los de solo espacios en contenido mixto o protegido. Admita únicamente excepciones de presentación aprobadas. Pruebe un segundo guardado y la aplicación consumidora; conserve el respaldo. toxml no garantiza bytes originales, canonicalización, firmas, escritura de entidades ni todas las características documentales. Estos ejemplos sintéticos de confianza no son una receta de seguridad para XML no confiable.

Diagrama de aceptación de dos guardadosXML
Ilustración original: compruebe versión, tramos completos de texto y el segundo guardado. Watch at Ease