簡體   English   中英

讀取XML頭編碼

[英]Reading XML header encoding

我有一些XML文件,我想用腳本處理它們,將它們從它們所處的任何編碼轉換為UTF-8。

使用這個偉大答案中給出的代碼我可以進行轉換,但是如何讀取XML頭中給出的編碼?

例如,我有許多已經使用UTF-8的文件,應該保留下來:

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

但是,我有很多這需要轉換的文件:

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

如何在Python中檢測這些文件頭中指定的XML編碼? 更好的是,在我檢測並重新編碼文件后,如何將此XML標頭更改為“utf-8”以避免將來處理它?

使用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再次寫入文件。

如何在Python中檢測這些文件頭中指定的XML編碼?

Rob Wolfe使用標准庫的解決方案

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)

我想擴展@ 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM