有效的 XML 文件需要 XML 声明吗?

我正在使用 Xerces 的 SaxParser 解析一个 XML 文件。
是否需要 XML 声明 <?xml version="1.0" encoding="UTF-8"?>

166362 次浏览

XML 声明是可选的,因此没有它,Xml 就是格式良好的。但是建议使用它,这样解析器就不会做出错误的假设,特别是关于所使用的编码。

只有在不使用 versionencoding的默认值(在该示例中就是这样)时,才需要使用这个函数。

在 XML 1.0中,XML 声明可以选择。请参阅 XML 1.0建议的第2.8节,其中说明“应该”使用它——这意味着建议使用它,但不是强制性的。但是,在 XML 1.1中,声明是 强制性的。请参阅 XML 1.1建议的第2.8节,其中使用了“ MUST”。它甚至声明 如果没有声明,这自动暗示文档是 XML 1.0文档。

请注意,在 XML 声明中,encodingstandalone都是可选的。只有 version是强制性的。而且,这些不是属性,所以如果它们存在,它们必须按照以下顺序排列: version,后面跟任何 encoding,后面跟任何 standalone

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>

如果不以这种方式指定编码,XML 解析器将尝试猜测所使用的编码。XML 1.0建议书描述了 字符编码可以被自动检测到的一种可能方式。在实践中,如果输入被编码为 UTF-8、 UTF-16或 US-ASCII,那么这不是什么大问题。当遇到使用 US-ASCII 范围之外的字符(例如 ISO 8859-1)的8位编码时,自动检测不起作用——尽可能避免创建这些编码。

standalone指示在不使用 DTD 的情况下是否可以正确处理 XML 文档。人们很少用它。如今,设计缺少 DTD 信息的 XML 格式是一件糟糕的事情。

更新:

一个“ prolog error/void utf-8 coding”错误表明解析器在文件中找到的实际数据与 XML 声明所说的编码不匹配。或者在某些情况下,文件内的数据与自动检测到的编码不匹配。

因为您的文件包含一个字节顺序标记(byte-order-mark,BOM) ,所以应该使用 UTF-16编码。我怀疑当 NotePad 将文件更改为 UTF-16时,您的声明显示的是 <?xml version="1.0" encoding="UTF-8"?>,这显然是不正确的。简单的解决方案是删除 encoding,简单地说 <?xml version="1.0"?>。您也可以编辑它来表示 encoding="UTF-16",但是对于原始文件(不在 UTF-16中)或者如果文件以某种方式被修改回 UTF-8或其他编码,这将是错误的。

不要费心去移除 BOM ——那不是问题的原因。使用 NotePad 或 WordPad 编辑 XML 才是真正的问题!