有效的XML文件是否需要XML声明?

我使用Xerces的Saxparsing器parsingXML文件。
是XML声明<?xml version="1.0" encoding="UTF-8"?>需要?

在XML 1.0中, XML声明可选的 。 请参阅XML 1.0build议书的2.8节 ,它说“应该”使用 – 这意味着它是推荐的,但不是强制性的。 但是,在XML 1.1中,声明是强制性的 。 请参阅XML 1.1build议的2.8节 ,其中指出必须使用“必须”。 它甚至会继续声明, 如果声明不存在,那自动暗示该文档是一个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"?> 

如果您不以这种方式指定编码,则XMLparsing器会尝试猜测正在使用的编码。 XML 1.0build议书描述了一种可以自动检测字符编码的方法 。 在实践中,如果input编码为UTF-8,UTF-16或US-ASCII,那么这不是一个大问题。 当遇到使用US-ASCII范围之外的字符的8位编码(例如ISO 8859-1)时,自动检测不起作用 – 如果可以的话,避免创build这些编码。

standalone表示XML文档是否可以在没有DTD的情况下正确处理。 人们很less使用它。 现在,devise一个缺lessDTD信息的XML格式是不好的。

更新:

“prolog error / invalid utf-8 encoding”错误表示parsing器在文件内find的实际数据与XML声明所说的编码不匹配。 或者在某些情况下,文件中的数据与自动检测的编码不匹配。

由于您的文件包含字节顺序标记(BOM),因此应该使用UTF-16编码。 我怀疑你的声明是<?xml version="1.0" encoding="UTF-8"?>当NotePad将文件改为UTF-16时,这显然是不正确的。 简单的解决scheme是删除encoding并简单地说<?xml version="1.0"?> 。 你也可以编辑它来说encoding="UTF-16"但是对于原始文件(不是UTF-16),或者文件改变回UTF-8或其他编码,这是错误的。

不要打扰试图删除BOM – 这不是问题的原因。 使用记事本或写字板来编辑XML是真正的问题!

Xml声明是可选的,所以你的XML是没有它的格式。 但是build议使用它,这样parsing器就不会做出错误的假设,特别是关于使用的编码。

只有当你没有使用versionencoding的默认值时(你在这个例子中)才需要。