检查是否存在XML声明

问题描述 投票:1回答:1

我试图检查一个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标头?

python xml elementtree xml-declaration
1个回答
1
投票

tl;博士

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或其他字符编码,则需要声明。如果在作为text / html的文档中遇到XML声明,则版本7之前的Internet Explorer会进入怪异模式

因此,即使在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"?>
© www.soinside.com 2019 - 2024. All rights reserved.