![](/img/trans.png)
[英]reading large xml file: go encoding/xml is twice as slow as python lxml
[英]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.