我正在使用Xerces的Sax解析器解析XML文件。
XML声明是否为<;?xml version=“1.0”encoding=“UTF-8”?>必需
在XML1.0中,XML声明是可选的。请参阅XML1.0建议的第2.8节,其中说“应该”使用它——这意味着它是建议的,但不是强制性的。然而,在XML1.1中,声明是强制的。请参阅XML1.1建议的第2.8节,其中指出必须使用“必须”。它甚至还声明,如果声明不存在,则自动暗示该文档是XML 1.0文档
注意,在XML声明中,编码和独立的都是可选的。只有版本是必需的。此外,这些不是属性,因此如果它们存在,它们必须按以下顺序排列:version,后跟anyencoding,后跟anystandalone
<;?xml version=“1.0”?>;
<;?xml version=“1.0”encoding=“UTF-8”?>;
<;?xml version=“1.0”standalone=“是”?>;
<;?xml version=“1.0”encoding=“UTF-16”standalone=“是”?>;
如果不以这种方式指定编码,XML解析器将尝试猜测正在使用的编码。XML1.0建议描述了自动检测字符编码的一种可能方法。在实践中,如果输入编码为UTF-8、UTF-16或US-ASCII,这并不是什么大问题。当遇到使用US-ASCII范围以外字符的8位编码(例如ISO 8859-1)时,自动检测不起作用——如果可以,请避免创建这些字符
standalone指示是否可以在没有DTD的情况下正确处理XML文档。人们很少使用它。现在,设计一种没有DTD而丢失信息的XML格式是一种不好的做法
更新:
“prolog error/invalid utf-8 encoding”错误表示解析器在文件中找到的实际数据与XML声明所说的编码不匹配。或者在某些情况下,文件中的数据与自动检测到的编码不匹配
因为您的文件包含字节顺序标记(BOM),所以它应该采用UTF-16编码。我怀疑您的声明中说的是<;?xml version=“1.0”encoding=“UTF-8”?>当文件被记事本更改为UTF-16时,这显然是不正确的。简单的解决方案是删除编码,然后简单地说<;?xml version=“1.0”?>。您也可以将其编辑为encoding=“UTF-16”,但对于原始文件(不在UTF-16中)或如果文件以某种方式更改回UTF-8或其他编码,则这是错误的
不要费心尝试删除BOM表——这不是问题的原因。使用记事本或写字板编辑XML才是真正的问题