检查是否存在XML声明

时间:2019-02-22 10:29:33

标签: python xml elementtree xml-declaration

我正在尝试检查xml文件是否包含必要的xml声明(“标头”),例如:

<?xml version="1.0" encoding="UTF-8"?>
...rest of xml file...

我正在使用xml ElementTree读取文件中的信息并从中获取信息,但是即使没有标题,它似乎也可以很好地加载文件。

到目前为止,我尝试过的是:

import xml.etree.ElementTree as ET
tree = ET.parse(someXmlFile)    

try:
    xmlFile = ET.tostring(tree.getroot(), encoding='utf8').decode('utf8')
except:
    sys.stderr.write("Wrong xml2 header\n")
    exit(31)

if re.match(r"^\s*<\?xml version=\'1\.0\' encoding=\'utf8\'\?>\s+", xmlFile) is None:
    sys.stderr.write("Wrong xml1 header\n")
    exit(31)

但是,如果文件中不存在ET.tostring()函数,则它只是“组成”标题。

有没有办法用ET检查xml标头?还是以某种方式在使用ET.parse加载文件时引发错误,如果文件不包含xml标头?

1 个答案:

答案 0 :(得分:1)

tl; dr

from xml.dom.minidom import parseString
def has_xml_declaration(xml):
    return parseString(xml).version

来自Wikipedia's XML declaration

  

如果XML文档缺少编码规范,则XML解析器将假定   除非编码已经是UTF-8或UTF-16   是由更高的协议确定的。

...

  

声明可以选择省略,因为它声明为   编码默认编码。但是,如果文件改为   使用XML 1.1或其他字符编码,则声明为   必要。如果版本7之前的Internet Explorer进入怪癖模式,如果   它在用作text / html

的文档中遇到XML声明

因此,即使在XML文档中省略了XML声明,代码片段也是如此:

if re.match(r"^<\?xml\s*version=\'1\.0\' encoding=\'utf8\'\s*\?>", xmlFile.decode('utf-8')) is None:

将在此XML文档中找到“ the”默认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 在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"?>