如何将ElementTree保存为UTF-16
我正在尝试用cElementTree保存一个以UTF-16编码的XML文件。这是同一个项目,但和之前提到的DOCTYPE问题不同,具体可以参考这个链接:如何用Python的cElementTree创建<!DOCTYPE>
我了解到,如果我在字符串中不声明编码,cElementTree会自动添加编码信息。所以,代码大致是这样的:
import xml.etree.cElementTree as ElementTree
from StringIO import StringIO
s = '<?xml version=\"1.0\" ?><!DOCTYPE tmx SYSTEM \"tmx14a.dtd\" ><tmx version=\"1.4a\" />'
tree = ElementTree.parse(StringIO(s)).getroot()
header = ElementTree.SubElement(tree,'header',{'adminlang': 'EN',})
body = ElementTree.SubElement(tree,'body')
ElementTree.ElementTree(tree).write('myfile.tmx','UTF-16')
当我用UTF-8写文件时,一切都很好。但是,当我改成UTF-16时,文本编码就出现了问题。而且还缺少了必要的字节顺序标记(Byte Order Marker,简称BOM)。当我尝试在字符串开头添加BOM时,
s = '\xFF\xFE<?xml version=\"1.0\"......
ElementTree就报错了:“格式不正确(无效的标记)第1行,第1列”。
所有的缓冲区都是unicode数据。我该如何保存成UTF-16的XML文件呢?
1 个回答
5
resultstring = ElementTree.tostring(tree, encoding='utf-16')
附注:因为ElementTree模块的接口在lxml库中是重复的,所以最好把ElementTree
导入为etree
。这样做可以减少将来如果需要使用更强大lxml
功能时所需的修改。