【发布时间】:2021-05-11 22:21:22
【问题描述】:
我在提供用于处理的 XML 文件中发现以下内容:<!DOCTYPE exchange_rates SYSTEM "">
空字符串对我来说没有任何意义,我在网上找不到任何关于它的讨论。如果我使用在线验证器,它们甚至都不会为此产生警告,也不会在引号之间添加任何垃圾,因此它们无法帮助我确定此声明是否无效。如果有效,该 XML 文件应该如何验证?
【问题讨论】:
我在提供用于处理的 XML 文件中发现以下内容:<!DOCTYPE exchange_rates SYSTEM "">
空字符串对我来说没有任何意义,我在网上找不到任何关于它的讨论。如果我使用在线验证器,它们甚至都不会为此产生警告,也不会在引号之间添加任何垃圾,因此它们无法帮助我确定此声明是否无效。如果有效,该 XML 文件应该如何验证?
【问题讨论】:
该 DOCTYPE 声明确实有效。要确定这一点,您可以查看规范...
在Prolog 部分,您将找到 DOCTYPE 声明的模型 (doctypedecl):
如果你再看看ExternalID:
您会看到SYSTEM 后面跟着SystemLiteral:
这表明引号可以为空。
如果有效,该 XML 文件应该如何验证?
由于 DOCTYPE 有一个空的 SYSTEM 标识符,并且没有可让您映射到 SYSTEM 标识符的 PUBLIC 标识符,因此无法以编程方式知道要验证的 DTD。
根据 DTD 验证此 XML 的唯一方法是让您提前知道它应该针对哪个 DTD 进行验证,并且无论您使用什么来验证都允许您指定与 DOCTYPE 声明分开的 DTD。 (例如,通过使用带有 xmllint 的 --dtdvalid arg。)
【讨论】: