我正在使用Xerces的Sax Parser解析XML文件
是否需要XML声明<?xml version="1.0" encoding="UTF-8"?>
?
答案 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声明中,encoding
和standalone
都是可选的。只有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)
仅在您未使用version
和encoding
(您在该示例中)的默认值时才需要。