【问题标题】:Checking if XML declaration is present检查是否存在 XML 声明
【发布时间】:2019-07-16 10:15:53
【问题描述】:

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

【问题讨论】:

  • 在 XML 文档中包含 XML 声明是一种很好的做法,但这不是严格的要求。它在这里说“应该”:w3.org/TR/xml/#sec-prolog-dtd
  • 嗨丹尼斯:你看到我的回答了吗?这对你来说是一个可行的解决方案吗?如果没有,您仍然有兴趣获得建议/答案吗?感谢您的回复。

标签: python xml elementtree xml-declaration


【解决方案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,除非编码已经 由更高的协议确定。

...

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

所以即使在 XML 文档中省略了 XML 声明,code-sn-p:

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,可以使用如下代码-sn-p:

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"?>

【讨论】:

  • 这两个字段得到set
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多