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

如何在Windows下使用lxml解析XML时保留属性值中的换行符?

如何在Windows系统中用lxml解析XML时保留属性值里的换行符?

问题场景

在Windows系统使用lxml解析XML文档时,属性值中的换行符(\n)会被自动替换成空格,但相同代码在Linux系统下能正常保留换行符。

测试解析代码如下:

from lxml import etree

root = etree.fromstring('<root attr1="line1\nline2"/>')
print(etree.tostring(root).decode())

Windows下输出结果:

<root attr1="line1 line2"/>

而创建XML时,lxml会自动将换行符转义为&#10;并保留:

from lxml import etree

root = etree.Element('root', attr1='line1\nline2')
print(root.attrib['attr1'])
print(etree.tostring(root).decode())

输出结果:

line1
line2
<root attr1="line1&#10;line2"/>

解决方案

通过创建XMLParser并关闭属性归一化(attribute_normalization=False),即可在Windows系统中禁用换行符转空格的行为。

修改后的解析代码:

from lxml import etree

# 创建解析器并关闭属性归一化
parser = etree.XMLParser(attribute_normalization=False)
root = etree.fromstring('<root attr1="line1\nline2"/>', parser=parser)
print(etree.tostring(root).decode())

此时Windows下的输出结果会保留换行符:

<root attr1="line1&#10;line2"/>

同时直接访问属性值也能拿到原始的换行符:

print(root.attrib['attr1'])
# 输出:
# line1
# line2

原理说明

lxml默认开启的attribute_normalization会按照XML规范对属性值中的空白字符(换行、制表符、连续空格等)进行归一化处理,将其替换为单个空格。在Windows系统中这个行为表现更显著,关闭该选项后,解析器会保留属性值中的原始空白字符,包括换行符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:42:43