tl; др
from xml.dom.minidom import parseString
def has_xml_declaration(xml):
return parseString(xml).version
Из XML-декларация Википедии
Если в документе XML отсутствует спецификация кодировки, то XMLparser предполагает, что кодировка UTF-8 или UTF-16, если только кодировка не была определена более высоким протоколом.
...
Объявление можетможет быть опущен, поскольку он объявляет в качестве своей кодировки кодировку по умолчанию.Однако, если документ вместо этого использует XML 1.1 или другую кодировку символов, объявление необходимо.Internet Explorer до версии 7 переходит в режим причуд, если он встречает объявление XML в документе, который используется как text / html
Таким образом, даже если объявление XML отсутствует в документе XML, фрагмент кода:
if re.match(r"^<\?xml\s*version=\'1\.0\' encoding=\'utf8\'\s*\?>", xmlFile.decode('utf-8')) is None:
найдет "XML-объявление по умолчанию" в этом XML-документе.Обратите внимание, что я использовал xmlFile.decode ('utf-8') вместо xmlFile.Если вы не беспокоитесь об использовании minidom
, вы можете использовать следующий фрагмент кода:
from xml.dom.minidom import parse
dom = parse('bookstore-003.xml')
print('<?xml version="{}" encoding="{}"?>'.format(dom.version, dom.encoding))
Вот рабочее fiddle Int bookstore-001.xml объявление XMLотсутствует в bookstore-002.xml объявление XML отсутствует, а в bookstore-003.xml объявление XML отличается от первого примера.Инструкция print
печатает соответственно версию и кодировку:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="None" encoding="None"?>
<?xml version="1.0" encoding="ISO-8859-1"?>