Python处理XML换行和空白需区分“有意义内容”与“格式化空白”:ElementTree默认保留所有空白,可用strip()清理首尾空白,lxml的remove_blank_text=True可跳过纯空白节点,输出时用minidom或lxml美化缩进。

Python处理XML中的换行和空白字符,核心在于区分「有意义的空白」和「格式化用的空白」——默认情况下,xml.etree.ElementTree(标准库)会保留所有文本内容,包括换行符\n、制表符\t和空格,但不会自动“美化”或“清理”。是否保留、如何清理,取决于你的使用场景。
理解XML中空白的两种角色
XML本身不区分“用户数据中的空格”和“编辑器缩进产生的空格”,但人类阅读时习惯用缩进来组织结构。ElementTree把这类缩进也当作普通文本节点(tail 或 text)读入。
-
元素之间的换行+缩进:通常出现在
中,会被存为\n ... parent.text或child.tail,值可能是'\n ' -
标签内纯文本中的换行:如
,这部分第一行\n第二行 \n属于内容,应保留
默认解析:保留所有空白,但可手动过滤
直接用ET.parse()或ET.fromstring()读取,空白照单全收。你可以遍历后统一清理:
import xml.etree.ElementTree as ETtree = ET.parse("data.xml") root = tree.getroot()
清理所有text/tail中的首尾空白(含\n\t),但不破坏内部换行
for elem in root.iter(): if elem.text is not None: elem.text = elem.text.strip() if elem.tail is not None: elem.tail = elem.tail.strip()
注意:strip()只去首尾,不影响中间的换行;若想彻底删除所有空白字符(不推荐),可用re.sub(r'\s+', '', elem.text),但会误伤真实内容。
立即学习“Python免费学习笔记(深入)”;
用xml.etree.ElementTree.XMLParser预设空白处理策略
从Python 3.9起,XMLParser支持strip_cdata=False,但真正控制空白的是target参数配合自定义处理器。更实用的是使用remove_whitespace=True(需第三方库)或改用lxml:
-
推荐轻量方案:用
minidom(标准库)的normalize()+ 手动删空文本节点 -
推荐生产方案:安装
lxml,它提供remove_blank_text=True选项
from lxml import etreeparser = etree.XMLParser(remove_blank_text=True) tree = etree.parse("data.xml", parser)
自动跳过仅含空白的text/tail节点
输出时控制换行与缩进(美化/压缩)
ElementTree默认输出无缩进。如需生成易读XML,可用xml.dom.minidom或lxml美化:
# 方法1:用minidom美化(适合小文件) rough_string = ET.tostring(root, encoding="unicode") reparsed = minidom.parseString(rough_string) print(reparsed.toprettyxml(indent=" "))方法2:lxml自动缩进(推荐)
root = etree.fromstring(rough_string) print(etree.tostring(root, pretty_print=True, encoding="unicode"))
注意:toprettyxml()会在每行末加多余换行,可用正则简单清洗;lxml的pretty_print更干净。
基本上就这些。关键不是“删不删换行”,而是明确哪些空白属于格式、哪些属于数据——按需处理,别一刀切。










