LXML转义字符转换

1 投票
1 回答
1983 浏览
提问于 2025-04-29 12:04

首先,我有一个脚本,它在一个以DOS格式保存的XML文件上运行。也就是说,这个文件的换行符是\r\n。此外,我处理的XML文件中,有些属性里嵌入了换行符。生成这个XML的编辑器把这些换行符编码成了:


我使用的是LXML库,在处理过程中,我把这些文本属性转换成了XML元素。问题是,带有换行符的文本块最终变成了元素,但在换行符前面多了一些奇怪的东西。也就是说,出现了
,我理解这和
是等价的。

对我来说,这似乎是个问题,因为我执行的脚本是在Linux环境下运行的,输出的是一个Linux格式的文件。

在我看来,LXML正确地识别了&#xA是一个转义的换行符,并在目标元素中替换成了实际的换行符。但它似乎忘记了&#xD

我创建了一个测试XML文件:

<?xml version='1.0' encoding='UTF-8'?>
<element1>
  <element2 value="0"/>
  <element3 documentation="Some documentation.&#xD;&#xA;&#xD;&#xA;Some more documentation"/>
</element1>

这里有一个示例Python文件,用于进行一些操作:

#!/usr/bin/env python
import re
import argparse
import sys

import lxml.etree as ET
xml = ET.parse('test.xml')
root = xml.getroot()
elem = root.find('element3')
doc = ET.SubElement(elem, 'documenation')
doc.text = elem.get('documentation')
xml.write('out.xml', encoding='UTF-8', method="xml", pretty_print=True)

这是输出结果:

 <element1>
  <element2 value="0"/>
  <element3 documentation="Some documentation.&#13;&#10;&#13;&#10;Some more documentation"><documenation>Some documentation.&#13;
&#13;
Some more documentation</documenation></element3>
</element1>

我想问的是,你们觉得这应该是这样工作的吧?我本以为在文档元素中,不应该再有这些 的引用了。如果我现在还得去查找这些多余的CR字符,那就显得有点不优雅了。

暂无标签

1 个回答

1

是的,这正是我预期的工作方式。虽然处理XML的程序在读取输入时需要统一行结束符,但在输出时并没有这样的要求。

如果我是你,我会修正生成那个XML的代码,避免在属性中放入换行符。如果实在不行,我会尝试:

doc.text = elem.get('documentation').replace('\r','')

撰写回答