Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有效的XML文件是否需要XML声明?_Xml_Xml Declaration - Fatal编程技术网

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

有效的XML文件是否需要XML声明?,xml,xml-declaration,Xml,Xml Declaration,我正在使用Xerces的Sax解析器解析XML文件。 XML声明是必需的吗?XML声明是可选的,因此没有它您的XML格式良好。但是建议使用它,以便解析器不会做出错误的假设,特别是关于所使用的编码。只有在未使用版本和编码(在该示例中)的默认值时,才需要使用它。在XML 1.0中,XML声明是可选的。看,它说“应该”使用——这意味着它是推荐的,但不是强制性的。然而,在XML1.1中,声明是强制的。看,上面写着“必须”的地方。它甚至还指出,如果没有声明,则自动意味着该文档是XML 1.0文档 注意,在

我正在使用Xerces的Sax解析器解析XML文件。

XML声明是必需的吗?

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

只有在未使用
版本
编码
(在该示例中)的默认值时,才需要使用它。

在XML 1.0中,XML声明是可选的。看,它说“应该”使用——这意味着它是推荐的,但不是强制性的。然而,在XML1.1中,声明是强制的。看,上面写着“必须”的地方。它甚至还指出,如果没有声明,则自动意味着该文档是XML 1.0文档

注意,在XML声明中,
编码
独立
都是可选的。只有
版本
是必需的。此外,这些不是属性,因此如果它们存在,它们必须按以下顺序排列:
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解析器将尝试猜测正在使用的编码。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编码。我怀疑您的声明中说的是
,当文件被记事本更改为UTF-16时,这显然是不正确的。简单的解决方案是删除
编码
,然后简单地说
。您也可以将其编辑为
encoding=“UTF-16”
,但对于原始文件(不在UTF-16中)或如果文件以某种方式更改回UTF-8或其他编码,则这是错误的


不要费心尝试删除BOM表——这不是问题的原因。使用记事本或写字板编辑XML才是真正的问题

有效文件和格式良好的文件之间存在差异。你指的是哪一个?我收到的是prolog错误/无效的utf-8编码。然后我在XML文件中找到了BOM,用户使用记事本打开该文件(我无法避免)。我不确定我指的是有效的或格式良好的文件。只需要避免这些错误,这就是为什么我要创建一个函数来删除InputStream中“是否有java类删除BOM?或xml文件中的几个字节?”之前的所有字节。我正在考虑FilterInputStream和PushbackInputStream中的skip方法,但不知道如何使用它。@eros:我不确定我指的是有效或格式良好的文件“请参阅,以获得对差异的简明解释。我的问题得到了回答,但我的后续问题没有得到回答。我是否需要为此提出另一个问题?或者请将其添加到此处。BOM可能是问题的原因。一些旧的XML解析器在UTF-8文档开始时不会接受BOM(它是为UTF-16设计的,并且只有在UTF-8之后才被接受)。但如果您使用的是最新版本的Xerces,则不太可能出现问题。另外请注意,在记事本的“另存为”对话框中,您可以选择将XML另存为什么编码。如果要删除BOM表,只需另存为“ASCII”(假设不使用任何Unicode字符)。对于较低的127个字符,ASCII和UTF-8是相同的。我是唯一一个觉得奇怪的人,在XML解析器已经开始解码您的文档之后,您告诉他们使用什么编码?我的意思很清楚,如果它能解析标签并理解它所说的话,那么它已经找到了正确的编码。我想不出编码属性有什么合法的用途。@Brainslaugs83在没有BOM表的情况下,编码被指定为8位。所以ASCII或UTF-8或任何一种旧的8位国家编码。XML声明的下半部分都是8位的,这在所有编码中是相等的,并传递足够的信息来选择上半部分。这不是最好的设计,但仍然比在CP1241和CP866之间进行猜测要好,这在过去的文本文件中是很常见的。但是他们应该说XML是UTF-8,这就是故事的结束。