我正在使用 Xerces 的 Sax Parser 解析 XML 文件。
是否需要XML 声明<?xml version="1.0" encoding="UTF-8"?>
?
3 回答
在 XML 1.0 中,XML 声明是可选的。请参阅XML 1.0 Recommendation 的第 2.8 节,其中说“应该”使用它——这意味着它是推荐的,但不是强制性的。然而,在 XML 1.1 中,声明是强制性的。请参阅XML 1.1 Recommendation 的第 2.8 节,其中说“必须”使用。它甚至继续声明,如果没有声明,则自动暗示该文档是 XML 1.0 文档。
请注意,在XML 声明中encoding
和standalone
都是可选的。只有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 才是真正的问题!
XML 声明是可选的,因此您的 xml 没有它的格式是正确的。但是建议使用它,这样解析器就不会做出错误的假设,特别是关于所使用的编码。
仅当您不使用version
and的默认值时才需要它encoding
(您在该示例中)。