【问题标题】:Does a valid XML file require an XML declaration?有效的 XML 文件是否需要 XML 声明?
【发布时间】:2011-08-10 07:45:37
【问题描述】:

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

【问题讨论】:

  • 有效文件和格式正确的文件是有区别的。你指的是哪一个?
  • 我收到序言错误/无效的 utf-8 编码。然后我在 XML 文件中找到了 BOM,用户使用记事本打开文件(我无法避免这种情况)。我不确定我指的是有效的或格式正确的文件。只需要避免错误,这就是我创建一个删除“
  • 是否有一个java类可以去除BOM?还是 xml 文件中的几个字节?来自输入流。我正在考虑 FilterInputStream 和 PushbackInputStream 中的跳过方法,但不知道如何使用它。
  • @eros: "我不确定我指的是有效的还是格式正确的文件" 请参阅Well-formed vs Valid XML 了解对差异的简明解释。跨度>

标签: xml xml-declaration


【解决方案1】:

在 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 声明 中,encodingstandalone 都是可选的。只有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 范围之外的字符(例如 ISO 8859-1)的 8 位编码时,自动检测不起作用 - 如果可以,请避免创建这些。

standalone 表示是否可以在没有 DTD 的情况下正确处理 XML 文档。人们很少使用它。现在,设计一个缺少 DTD 的信息的 XML 格式是很糟糕的。

更新:

“prolog 错误/无效的 utf-8 编码”错误表明解析器在文件中找到的实际数据与 XML 声明中所说的编码不匹配。或者在某些情况下,文件中的数据与自动检测到的编码不匹配。

由于您的文件包含字节顺序标记 (BOM),因此它应该采用 UTF-16 编码。我怀疑您的声明说 &lt;?xml version="1.0" encoding="UTF-8"?&gt; 当文件被记事本更改为 UTF-16 时,这显然是不正确的。简单的解决方案是删除encoding 并简单地说&lt;?xml version="1.0"?&gt;。您也可以将其编辑为 encoding="UTF-16",但这对于原始文件(不在 UTF-16 中)或文件以某种方式更改回 UTF-8 或其他编码是错误的。

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

【讨论】:

  • 我的问题得到了回答,但我的后续问题没有。我需要为此创建另一个问题吗?或者请在此处添加。
  • BOM 可能是问题的原因。一些较旧的 XML 解析器不会接受 UTF-8 文档开头的 BOM(它是为 UTF-16 设计的,后来才被 UTF-8 接受)。但如果您使用的是最新版本的 Xerces,这不太可能成为问题。
  • 另外请注意,在记事本的“另存为”对话框中,您可以选择将 XML 保存为的编码。如果要删除 BOM,只需另存为“ASCII”(假设您没有使用任何 Unicode 字符)。对于低 127 个字符,ASCII 和 UTF-8 是相同的。
【解决方案2】:

Xml 声明是可选的,因此您的 xml 没有它的格式是正确的。但是建议使用它,这样解析器就不会做出错误的假设,特别是关于所使用的编码。

【讨论】:

  • 只有我一个人觉得奇怪的是,您告诉 XML 解析器在他们已经开始解码您的文档后使用什么编码?我的意思很清楚,如果它可以解析该标签并理解它所说的内容,那么它已经找到了正确的编码。我想不出 encoding 属性的任何合法用途。
  • @BrainSlugs83 在无 BOM 中,编码指定为 8 位。因此,ASCII 或 UTF-8 或其中任何一个旧的 8 位国家编码。 XML 声明都是 8 位的下半部分,在所有这些编码中是相等的,并传达了足够的信息来选择上半部分。不是最好的设计,但仍然比在 CP1241 和 CP866 之间猜测要好,这在过去的文本文件中很常见。
  • 但是他们应该说 XML 是 UTF-8 - 故事结束。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2010-12-01
    • 2018-07-17
    • 2010-11-23
    • 2023-03-13
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多