如何用Python操作XML时保留属性字符串中的换行符?
解决方案:保留XML属性中的换行符并复制指定元素
问题背景
XML属性字符串允许包含换行符,但使用Python标准库xml.etree.ElementTree处理时,复制元素后属性中的换行符会被替换为空格,导致格式丢失。需要在macOS+MacPorts Python3.11环境下实现保留换行符的元素复制功能。
原因分析
xml.etree.ElementTree会按照XML规范自动规范化属性值,将换行符、制表符等空白字符替换为单个空格,这是标准库的默认行为。要保留原始属性格式,需要使用支持保留原始空白的XML处理库。
解决方案:使用lxml库
lxml是功能更强大的XML处理库,默认支持保留属性中的原始空白字符,适合处理这类场景。
步骤1:安装lxml
针对MacPorts的Python3.11,执行以下命令安装:
pip3.11 install lxml
步骤2:修改脚本
替换原脚本中的xml.etree.ElementTree为lxml.etree,核心逻辑不变,lxml会自动保留属性中的换行符:
from lxml import etree import copy def double_override_entries(input_file, search_id, replace_id, output_file): # 解析XML,lxml默认保留属性原始空白 tree = etree.parse(input_file) root = tree.getroot() for override_elem in root.xpath(".//override"): for language_elem in override_elem.xpath(f".//language[@id='{search_id}']"): language_elem_copy = copy.deepcopy(language_elem) language_elem_copy.set('id', replace_id) override_elem.append(language_elem_copy) # 生成XML字符串,保留声明和原始格式 xml_str = etree.tostring(root, encoding='utf-8', xml_declaration=True).decode('utf-8') with open(output_file, 'w', encoding='utf-8') as file: file.write(xml_str) input_file = "input.xml" search_id = "yy" replace_id = "zz" output_file = "output.xml" double_override_entries(input_file, search_id, replace_id, output_file)
测试验证
使用提供的输入XML运行脚本后,输出的<language id="zz">元素的labelText属性会完整保留原始换行符,不会被替换为空格。
替代方案(不使用第三方库)
如果无法安装第三方库,需要手动读取XML文本,通过字符串处理定位并复制元素,但这种方式容易出错,仅推荐在受限环境下使用。例如:
- 读取XML文件为字符串
- 用正则匹配目标
<language>元素 - 复制匹配到的内容并替换
id属性 - 将新元素插入到指定位置
这种方式需要严格匹配XML结构,维护成本较高,优先推荐使用lxml方案。
内容的提问来源于stack exchange,提问作者gctwnl
相关产品推荐
相关产品推荐

