129

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

4

3 回答 3

194

在 XML 1.0 中,XML 声明可选的。请参阅XML 1.0 Recommendation 的第 2.8 节,其中说“应该”使用它——这意味着它是推荐的,但不是强制性的。然而,在 XML 1.1 中,声明是强制性的。请参阅XML 1.1 Recommendation 的第 2.8 节,其中说“必须”使用。它甚至继续声明,如果没有声明,则自动暗示该文档是 XML 1.0 文档。

请注意,在XML 声明encodingstandalone都是可选的。只有version是强制性的。此外,这些不是属性,因此如果它们存在,它们必须按以下顺序排列:version,然后是 any encoding,然后是 any 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 Recommendation 描述了一种可以自动检测字符编码的可能方式。实际上,如果输入编码为 UTF-8、UTF-16 或 US-ASCII,这不是什么大问题。当遇到使用 US-ASCII 范围之外的字符(例如 ISO 8859-1)的 8 位编码时,自动检测不起作用——如果可以,请避免创建这些。

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

更新:

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

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

不要费心尝试删除 BOM - 这不是问题的原因。使用记事本或写字板编辑 XML 才是真正的问题!

于 2011-08-10T08:20:34.473 回答
8

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

于 2011-08-10T07:47:11.107 回答
4

仅当您不使用versionand的默认值时才需要它encoding(您在该示例中)。

于 2011-08-10T07:51:48.530 回答