读取XML头编码

时间:2014-09-11 20:19:35

标签: python xml encoding

我有一些XML文件,我想用脚本处理它们,将它们从它们所处的任何编码转换为UTF-8。

使用this great answer中给出的代码我可以进行转换,但是如何读取XML头中给出的编码?

例如,我有许多已经使用UTF-8的文件,应该单独使用:

<?xml version="1.0" encoding="utf-8"?>

但是,我有很多需要转换的文件:

<?xml version="1.0" encoding="windows-1255"?>

如何在Python中检测这些文件的标头中指定的XML编码?更好的是,在我检测并重新编码文件后,如何将此XML标题更改为“utf-8”以避免将来处理它?<​​/ p>

3 个答案:

答案 0 :(得分:5)

使用lxml进行解析;然后,您可以使用以下命令访问原始编码:

from lxml import etree

with open(filename, 'r') as xmlfile:
    tree = etree.parse(xmlfile)
    if tree.docinfo.encoding == 'utf-8':
        # already in correct encoding, abort
        return

然后,您可以使用lxml以UTF-8再次写出文件。

答案 1 :(得分:1)

  

如何检测这些标头中指定的XML编码   Python中的文件?

Rob Wolfe的solution仅使用标准库:

from xml.parsers import expat

s = """<?xml version='1.0' encoding='iso-8859-1'?>
       <book>
           <title>Title</title>
           <chapter>Chapter 1</chapter>
       </book>"""

class MyParser(object):
    def XmlDecl(self, version, encoding, standalone):
        print "XmlDecl", version, encoding, standalone

    def Parse(self, data):
        Parser = expat.ParserCreate()
        Parser.XmlDeclHandler = self.XmlDecl
        Parser.Parse(data, 1)

parser = MyParser()
parser.Parse(s)

答案 2 :(得分:0)

我想扩展@PiotrDobrogost的答案,并实际编写一个检索XML文档编码的类:

from xml.parsers import expat

class XmlParser(object):
    '''class used to retrive xml documents encoding
    '''

    def get_encoding(self, xml):
        self.__parse(xml)
        return self.encoding

    def __xml_decl_handler(self, version, encoding, standalone):
        self.encoding = encoding

    def __parse(self, xml):
        parser = expat.ParserCreate()
        parser.XmlDeclHandler = self.__xml_decl_handler
        parser.Parse(xml)

这是其用法示例:

xml = """<?xml version='1.0' encoding='iso-8859-1'?>
    <book>
        <title>Title</title>
        <chapter>Chapter 1</chapter>
    </book>"""
parser = XmlParser()
encoding = parser.get_encoding(xml)