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

ero*_*ros 116 xml xml-declaration

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

Hoy*_*len 176

在XML 1.0中,XML声明可选的.请参阅XML 1.0建议书的第2.8节,其中说"应该"使用它 - 这意味着它是推荐的,但不是强制性的.但是,在XML 1.1中,声明是强制性的.请参阅XML 1.1建议书的第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"?>
Run Code Online (Sandbox Code Playgroud)

如果不以这种方式指定编码,XML解析器会尝试猜测正在使用的编码.XML 1.0 Recommendation描述了一种可以自动检测字符编码的方法.实际上,如果输入编码为UTF-8,UTF-16或US-ASCII,则这不是什么大问题.当遇到使用US-ASCII范围之外的字符的8位编码(例如ISO 8859-1)时,自动检测不起作用 - 如果可以,请避免创建这些编码.

standalone指示是否将XML文档可以在没有DTD或无法正确处理.人们很少使用它.如今,如果没有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是真正的问题!

  • BOM可能是问题的原因.一些较旧的XML解析器不会在UTF-8文档的开头接受BOM(它是为UTF-16设计的,以后只能在UTF-8中使用).但如果您使用最新版本的Xerces,则不太可能出现问题. (4认同)

Ara*_*ram 8

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

  • 我是唯一一个发现奇怪的是,你告诉XML解析器在他们已经开始解码你的文档后要使用什么编码?我的意思是,如果它可以解析该标签并理解它所说的内容,那么它已经找到了正确的编码.我想不出编码属性的任何合法用法. (3认同)
  • @ BrainSlugs83在没有BOM的情况下,编码被指定为8位.所以要么是ASCII或UTF-8,要么是任何旧的8位国家编码.XML声明都是8位的下半部分,它在所有这些编码中是相等的,并且传达了足够的信息来选择上半部分.不是最好的设计,但仍然比CP1241和CP866之间的猜测更好,因为它们是旧时代的文本文件常见的. (2认同)

Que*_*tin 5

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