我正在使用Xerces的Sax解析器解析XML文件。
是否<?xml version="1.0" encoding="UTF-8"?>
需要XML声明?
我正在使用Xerces的Sax解析器解析XML文件。
是否<?xml version="1.0" encoding="UTF-8"?>
需要XML声明?
Answers:
在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建议书描述了一种可以自动检测字符编码的可能方式。实际上,如果输入被编码为UTF-8,UTF-16或US-ASCII,这并不是什么大问题。当自动检测遇到使用US-ASCII范围之外的字符的8位编码(例如ISO 8859-1)时,自动检测将不起作用-如果可以,请避免创建这些字符。
的standalone
指示是否将XML文档可被正确地处理,而不DTD或没有。人们很少使用它。如今,设计一种缺少DTD而缺少信息的XML格式是一件很糟糕的事情。
更新:
“序言错误/无效的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或WordPad编辑XML是真正的问题!
Xml声明是可选的,因此没有它的xml格式正确。但是建议使用它,以使解析器不会做出错误的假设,特别是关于所使用的编码。