【问题标题】:Is the XML declaration node mandatory?XML 声明节点是强制性的吗?
【发布时间】:2011-01-13 10:40:38
【问题描述】:

我和我的一位同事讨论了 XML 声明节点(我说的是这个 => <?xml version="1.0" encoding="UTF-8"?>)。

我相信,要称为“有效的 XML”,它需要一个 XML 声明节点。

我的同事说 XML 声明节点是可选的,因为默认编码是 UTF-8 并且版本始终是 1.0。这是有道理的,但标准是怎么说的呢?

简而言之,给定以下文件:

<books>
  <book id="1"><title>Title</title></book>
</book>

我们可以这样说吗:

  1. 它是有效的 XML 吗?
  2. 它是一个有效的 XML 节点吗?
  3. 这是一个有效的 XML 文档吗?

非常感谢。

【问题讨论】:

    标签: xml naming


    【解决方案1】:

    这个:

    <?xml version="1.0" encoding="UTF-8"?>
    

    不是处理指令——它是XML 声明。其目的是在开始读取文档的其余部分之前正确配置 XML 解析器。

    它看起来像一个处理指令,但与真正的处理指令不同,它不会是解析器创建的 DOM 的一部分。

    “有效” XML 没有必要。 “有效” 表示“表示定义良好的文档类型,如 DTD 或模式中所述”。如果没有模式或 DTD,单词 “valid” 就没有意义。

    许多人误用了“有效”,而他们真正的意思是“格式良好”。格式良好的 XML 文档是遵循 XML 基本语法规则的文档。

    对于格式正确的文档也不需要 XML 声明,因为 versionencoding 都有默认值(分别为 1.0UTF-8/UTF-16)。如果文件中存在 Unicode BOM(字节顺序标记),则它确定编码。如果没有 BOM 和 XML 声明,则假定为 UTF-8。

    这是一个关于编码声明和检测如何在 XML 文件中工作的规范线程。 How default is the default encoding (UTF-8) in the XML Declaration?


    对于您的问题:

    1. 它是有效的 XML 吗?
      没有 DTD 或模式就无法回答这个问题。不过,它的格式很好。
    2. 这是一个有效的 XML 节点?
      node 是一个与文档(DOM)的内存表示相关的概念。这个 sn-p 可以解析成一个节点,因为它的格式是正确的。
    3. 这是一个有效的 XML 文档?
      请参阅 #1。

    您在这里混淆了一些 XML 概念(不用担心,这种混淆很常见,部分原因是概念重叠并且名称经常被误用)。

    • 一切都始于结构化数据,由名称、值和属性组成,以树的形式组织起来。
    • XML 基本上意味着以文本形式表示这种结构化数据的语法(它是一种“标记语言”)。这是当您将树序列化 成一串字符时得到的,它可用于再次将一串字符反序列化 成一棵树。
    • Document 通常是指表示序列化树的字符串。它可以存储在文件中、通过网络发送或在内存中创建。
    • 序列化和反序列化的规则定义非常严格。可以成功反序列化成树的文档(“字符串”)被称为格式良好
    • 这种树的语义(允许的元素、元素计数和顺序、命名空间,实际上是任意数量的复杂规则)可以在所谓的 DTD 或模式中定义。如果一棵树遵循一组明确定义的语义,则称其为有效
    • 文档对象模型 (DOM) 一词是指结构化数据的标准化内存表示。它是一个定义明确的 API 的名称,用于使用标准化方法访问此树。
    • 节点是文档对象模型的基本数据结构。

    【讨论】:

    • +1。非常感谢您提供这个完整且非常有启发性的答案。我更新了我的问题,将“处理指令节点”替换为“XML 声明”,以防有人使用适当的术语查找相同的问题。
    • 默认编码不仅仅是UTF-8。如果 XML 声明中未指定编码,则编码可以是 UTF-8UTF-16(如果在字节顺序标记 (BOM) 中定义),或者最后是 UTF-8(如果不存在 BOM)。
    • 好点,我没想到。我添加了一些说明和一个指向详细信息的线程的链接。
    【解决方案2】:

    根据可扩展标记语言(XML)1.0(第五版) W3C 建议 2008 年 11 月 26 日,部分: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-prolog-dtd
    没有 xml 声明,它是无效的(即使它格式正确,完整)。

    【讨论】:

    • 规范声明 XML 文档应该以 XML 声明开头。它确实说没有 XML 声明的 XML 文档是无效的。
    【解决方案3】:

    规范规定:

    Definition: XML documents SHOULD begin with an XML declaration which specifies the version of XML being used.

    而且对于一个有效的文档,它应该有一个与之关联的文档类型声明。您在此处显示的 sn-p 似乎是一个格式良好的节点,但绝不是有效的文档。

    【讨论】:

      【解决方案4】:

      请注意,有效性取决于与文档关联的 DTD 或模式。你的情况

      <books>
        <book id="1"><title>Title</title></book>
      </book>
      

      DTD 必须具有的最小值是元素“books”、“book”和“title”,并且“book”有一个带有“id”的 ATTLIST,定义“id”的类型以及它是强制性的还是可选的。它还将声明“book”可以/必须包含“title”,并且“title”可以(或必须)包含 PCDATA 内容(字符串)。

      DTD 还可能声明某些其他元素必须存在,在这种情况下,您的 XML 文档将无效。有许多 DTD 会使您的文档有效,而许多 DTD 会使它无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2017-07-26
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        相关资源
        最近更新 更多