使用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实体引用 ,解析修改后再写入,实体引用会被保留,从而在输出XML中保留换行的语义。
具体步骤:
- 读取XML文件原始内容,将属性值里的换行替换为
- 解析并修改XML
- 写入输出文件
示例代码(lxml版本):
import lxml.etree as ET # 读取原始文件并替换换行为实体引用 with open("input.xml", "r", encoding="utf-8") as f: content = f.read().replace('\n', ' ') # 解析处理 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 a test with line breaks "/> </xml>
后续读取使用时,将 转回\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', ' ') root = ET.fromstring(content) # 执行修改操作 ET.ElementTree(root).write("output.xml", encoding="utf-8", xml_declaration=True)
内容的提问来源于stack exchange,提问作者Tim Meyer
相关产品推荐
相关产品推荐

