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

时间:2011-08-10 07:45:37

标签: xml xml-declaration

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

3 个答案:

答案 0 :(得分:168)

在XML 1.0中, XML声明可选。请参阅section 2.8 of the XML 1.0 Recommendation,其中说“应该”使用 - 这意味着建议使用,但不是强制性的。但是,在XML 1.1中,声明是强制。见section 2.8 of the XML 1.1 Recommendation,其中说“必须”使用。它甚至继续陈述 if 声明不存在,这自动暗示文档是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 Recommendation描述了一种可能的方式character encoding can be autodetected。实际上,如果输入编码为UTF-8,UTF-16或US-ASCII,这不是什么大问题。当遇到使用US-ASCII范围之外的字符的8位编码(例如ISO 8859-1)时,自动检测不起作用 - 如果可以,请避免创建这些编码。

standalone表示是否可以在没有DTD的情况下正确处理XML文档。人们很少使用它。目前,如果没有DTD,设计缺少信息的XML格式是不好的。

更新

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

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

不要试图删除BOM - 这不是问题的原因。使用NotePad或写字板编辑XML是真正的问题!

答案 1 :(得分:8)

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

答案 2 :(得分:3)

仅在您未使用versionencoding(您在该示例中)的默认值时才需要。