我试图检查一个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标头?
tl;博士
from xml.dom.minidom import parseString
def has_xml_declaration(xml):
return parseString(xml).version
如果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"?>