You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:32:39