如何验证xml编码

时间:2013-07-08 19:57:17

标签: python xml xml-parsing

我正在尝试解析在我公司内部创建的XML文件。该文件应该是UTF-16编码但我收到的错误与我正在编写的Python脚本(见下文)。我想弄清楚问题是文件还是我的脚本。有没有办法验证编码?我的所有搜索都以XML验证工具或工具结束,这些工具或工具检查格式良好的XML。我希望尝试使用XMLSpy,但我目前无法访问它。

抛出错误的代码是'parser.parse'行(Python 2.7):

from xml.sax import make_parser
from xml.sax.handler import ContentHandler
import codecs

parser = make_parser()
curHandler = XmlHandler()
parser.setContentHandler(curHandler)

parser.parse(codecs.open(infile, 'rb', fileEncoding))

其中'infile'是有问题的XML文件,在这个例子中'fileEncoding'是'UTF-16'。

该脚本适用于UTF-8编码文件。但是对于UTF-16文件,我收到以下错误:

xml.sax._exceptions.SAXParseException: XmlFile.xml:1:30: encoding specified in XML declaration is incorrect

我很抱歉,但我无法发布XML。它并不复杂,但包含来自多个国家的文字/名称。我目前怀疑编码是UTF-8,但编码属性设置为UTF-16。有没有办法验证这个?

更新: 好。所以现在我完全糊涂了。我将XML文件上的编码更改为UTF-8而不是UTF-16,但忘记在脚本上更改它。该脚本按预期运行。所以文件encoding ='UTF-8',但用:

打开
parser.parse(codecs.open(infile, 'rb', 'UTF-16'))

按预期工作,没有错误。

更多信息:我正在Win7 / Server 2008环境中开发/执行。

1 个答案:

答案 0 :(得分:1)

让自己成为一个HEX编辑器(或编写一个程序来转储输入文件的前八个字节)。

  1. 从一开始就寻找Byte order mark(BOM)。如果它在那里,那就是你的编码。
  2. 否则你应该看到0x3C(UTF-8),0x003C(UTF-16)或者可能,但不可能,0x0000003C(UTF-32)(开场{{1} XML prolog的特征。