LXML自动转换Windows换行符:是否为特性?能否保留原始文本?
问题
尝试解析一段包含Windows换行符(CR+LF组合)的XML字符串:
from lxml.etree import XML root = XML('<root>_\r\n_\n_</root>') print( [ord(char) for char in root.text], )
但得到的文本中却只包含Linux换行符(LF字符):
[95, 10, 95, 10, 95]
请问这是有文档记录的特性吗?是否可以修改其行为以获取未修改的原始文本?当前使用的是最新版本的LXML 5.2.2。
注:相关链接问题与我的问题不相关——它讨论的是Fedora 17和18之间的软件变更,而此行为实际上是XML标准定义的。且该问题的答案并未解决我的问题,它建议将手动添加的换行符替换为三引号字符串。
解答
- 这是XML标准明确规定的行为:根据XML 1.0规范,解析器必须将所有的CR+LF(\r\n)和单独的CR(\r)统一转换为LF(\n)。lxml作为合规的XML解析器,自然遵循这个规则。
- lxml的官方文档中明确记录了这一默认行为:换行符规范化是XML解析流程中的标准步骤,属于合规解析的一部分。
- 无法通过修改lxml的解析配置来跳过换行符规范化,因为这违反XML标准。如果需要保留原始的CR+LF格式,可以通过以下方式处理:
- 预处理XML字符串:将
\r\n替换为自定义占位符(例如__CRLF__),完成XML解析后再将占位符替换回\r\n; - 直接处理原始字符串:放弃使用XML解析器的结构化提取,自行读取和处理原始文本,但这种方式会丢失XML解析的结构化能力。
- 预处理XML字符串:将
内容的提问来源于stack exchange,提问作者Jeyekomon
相关产品推荐
相关产品推荐

