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

使用lxml解析时保留XML属性中的换行符

保留XML属性内换行符的Python实现方法

我用Python脚本批量处理XML文件时,发现属性里的换行符在解析后被替换成了空格,示例如下:

输入XML:

<?xml version='1.0' encoding='UTF-8'?>
<xml>
    <test value="This is
    a test

    with line breaks
    "/>
</xml>

执行以下lxml脚本后:

import lxml.etree as ET

with open("input.xml", "r", encoding="utf-8") as f:
    source = ET.parse(f)
    root = source.getroot()
    dest = ET.ElementTree(root)
    dest.write("output.xml", encoding="utf-8", xml_declaration=True)

输出的XML里换行符被替换为空格:

<?xml version='1.0' encoding='UTF-8'?>
<xml>
    <test value="This is  a test   with line breaks  "/>
</xml>

虽然这符合W3C规范,但我需要在修改XML时保留这些换行符,以下是可行的解决方案:


方案一:使用字符引用替换换行符

XML规范会自动规范化属性内的空白字符(换行、回车、制表符都转成空格),要保留换行,需先把换行转成XML实体引用&#10;,解析修改后再写入,实体引用会被保留,从而在输出XML中保留换行的语义。

具体步骤:

  1. 读取XML文件原始内容,将属性值里的换行替换为&#10;
  2. 解析并修改XML
  3. 写入输出文件

示例代码(lxml版本):

import lxml.etree as ET

# 读取原始文件并替换换行为实体引用
with open("input.xml", "r", encoding="utf-8") as f:
    content = f.read().replace('\n', '&#10;')

# 解析处理
root = ET.fromstring(content)
# 这里可添加自定义修改逻辑,比如修改其他属性或元素

# 写入文件,设置method='xml'确保实体被保留
tree = ET.ElementTree(root)
tree.write("output.xml", encoding="utf-8", xml_declaration=True, method='xml')

输出的XML会变成:

<?xml version='1.0' encoding='UTF-8'?>
<xml>
    <test value="This is&#10;    a test&#10;&#10;    with line breaks&#10;"/>
</xml>

后续读取使用时,将&#10;转回\n即可恢复原始换行。


方案二:lxml自定义解析与写入(特殊场景适用)

如果不想使用实体引用,可通过lxml的底层Parser接口自定义解析逻辑,捕获属性值并保留原始换行,写入时手动处理属性输出。但这种方式违反XML规范,部分XML处理器可能无法正确解析,仅推荐在特殊场景下使用。


xml.etree.ElementTree的处理方式

xml.etree.ElementTree的处理逻辑和lxml一致,同样需要先替换换行为实体引用,示例代码:

import xml.etree.ElementTree as ET

# 读取并替换换行
with open("input.xml", "r", encoding="utf-8") as f:
    content = f.read().replace('\n', '&#10;')

root = ET.fromstring(content)
# 执行修改操作

ET.ElementTree(root).write("output.xml", encoding="utf-8", xml_declaration=True)

内容的提问来源于stack exchange,提问作者Tim Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:57:35