Python 2.7中如何阻止ElementTree.parse()序列化换行符?
当然有办法解决这个问题!我之前也遇到过类似需求——为了源XML的可读性把长文本拆成多行,但序列化输出时要合并成单行。下面是具体的实现方案:
核心思路
问题的本质是:ElementTree读取XML时会保留源文件里的换行、缩进等空白字符,我们需要清理元素文本中的冗余空白,再调整序列化参数确保输出紧凑。
1. 先看示例场景
假设你的tasks.xml内容是这样的:
完成项目文档的编写 包括API说明和使用示例 确保格式符合团队规范
当前你的read.py可能直接读取后序列化,导致输出保留了这些换行。我们需要修改脚本,先清理文本再输出。
2. 标准库ElementTree实现方案
用Python标准库的xml.etree.ElementTree就能搞定,步骤如下:
import xml.etree.ElementTree as ET import re # 1. 读取XML文件 tree = ET.parse('tasks.xml') root = tree.getroot() # 2. 遍历目标元素,清理文本中的冗余空白 for task in root.findall('task'): if task.text: # 先去掉首尾空白,再把所有连续的换行、空格、制表符替换成单个空格 cleaned_text = re.sub(r'\s+', ' ', task.text.strip()) task.text = cleaned_text # 3. 序列化输出(默认就是紧凑格式,不会自动添加换行) # 如果要打印输出 print(ET.tostring(root, encoding='utf-8').decode('utf-8')) # 如果要写入文件 with open('output_tasks.xml', 'wb') as f: f.write(ET.tostring(root, encoding='utf-8', xml_declaration=True))
运行后,输出的<task>内容会变成单行:
完成项目文档的编写 包括API说明和使用示例 确保格式符合团队规范
3. 进阶:用lxml优化(可选)
如果你项目里已经在用lxml库,它的序列化控制更灵活,可以直接关闭美化输出:
from lxml import etree import re tree = etree.parse('tasks.xml') root = tree.getroot() # 同样清理文本 for task in root.xpath('//task'): if task.text: cleaned_text = re.sub(r'\s+', ' ', task.text.strip()) task.text = cleaned_text # 强制输出紧凑格式,禁止自动换行缩进 output = etree.tostring(root, encoding='utf-8', pretty_print=False, xml_declaration=True) print(output.decode('utf-8'))
注意事项
- 如果你的XML文本包含CDATA块,需要单独处理CDATA节点的内容,逻辑类似:找到CDATA子节点,清理其内部文本后替换。
- 如果你只想去掉换行但保留单个空格,正则
r'\n+'可以精准替换换行符,而不是所有连续空白。
内容的提问来源于stack exchange,提问作者M Doe
相关产品推荐
相关产品推荐

