我正在尝试检查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标头?
答案 0 :(得分:1)
tl; dr
from xml.dom.minidom import parseString
def has_xml_declaration(xml):
return parseString(xml).version
如果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"?>