1. 14 XML 语法
    1. 14.1 使用 XML 语法编写文档
    2. 14.2 解析 XML 文档
    3. 14.3 序列化 XML 片段
    4. 14.4 解析 XML 片段

14 XML 语法

HTML/XHTML

所有当前引擎都支持。

Firefox2+Safari3.1+Chrome4+
Opera9+Edge79+
Edge (旧版)12+Internet Explorer9+
Firefox Android4+Safari iOS2+Chrome Android18+WebView Android2+Samsung Internet1.0+Opera Android10.1+

本节仅描述 XML 资源的规则。关于 text/html 资源的规则在上一节“HTML 语法”中讨论。

14.1 使用 XML 语法编写文档

HTML 的 XML 语法以前称为“XHTML”,但本规范不使用该术语(除其他原因外,因为 MathML 和 SVG 的 HTML 语法中未使用此类术语)。

XML 的语法在 XMLXML 中的命名空间 中定义。 [XML] [XMLNS]

本规范除了为 XML 本身定义的语法级要求外,未定义任何其他要求。

XML 文档可以根据需要包含 DOCTYPE,但这并非符合本规范的必要条件。本规范未定义公共标识符或系统标识符,也未提供正式的 DTD。

根据 XML,XML 处理器不能保证处理 DOCTYPE 中引用的外部 DTD 子集。例如,这意味着如果在外部文件中定义了 XML 文档中字符的 实体引用,则使用它们是不安全的(<>&"' 除外)。

14.2 解析 XML 文档

本节描述了 XML 和 DOM 之间的关系,并特别强调了它与 HTML 的交互方式。

就本规范而言,XML 解析器 是一个遵循 XML 中给出的规则将字节或字符字符串映射到 Document 对象的构造。

在撰写本文时,实际上不存在此类规则。

一个 XML 解析器 或者在创建时与 Document 对象关联,或者隐式地创建一个对象。

然后,必须使用表示传递给解析器的输入的树结构的 DOM 节点填充此 Document,如 XMLXML 中的命名空间DOM 中所定义。在创建表示元素的 DOM 节点时,必须使用 为标记创建元素 算法或在适当的 XML 数据结构上运行的某些等效算法,以确保创建正确的 元素接口 并正确设置 自定义元素

对于 XML 解析器Document 的树执行的操作,用户代理必须表现得好像元素和属性分别被单独追加和设置一样,以便触发本规范中关于将元素插入文档或设置其属性时发生情况的规则,并且 DOM 中关于 变异观察器 的要求意味着会触发变异观察器。 [XML] [XMLNS] [DOM] [UIEVENTS]

在解析元素的开始标记和解析元素的结束标记或解析器检测到格式良好的错误之间的时间段内,用户代理必须表现得好像该元素位于 打开元素栈 中。

各种元素会利用此特性,仅在它们从 打开元素栈 中弹出后才开始某些进程。

This specification provides the following additional information that user agents should use when retrieving an external entity: the public identifiers given in the following list all correspond to the URL given by this link. (This URL is a DTD containing the entity declarations for the names listed in the named character references section.) [XML]

此外,当使用上述公共标识符之一时,用户代理应尝试检索上述外部实体的内容,并且不应尝试检索任何其他外部实体的内容。

这严格来说不是对 XML违反,但它确实与 XML 要求的精神相矛盾。这是出于希望用户代理都能以一种互操作的方式处理实体,而无需任何网络访问来处理外部子集的愿望。 [XML]

可以使用 启用 XML 脚本支持禁用 XML 脚本支持 来调用 XML 解析器。除非另有说明,否则使用 启用 XML 脚本支持 来调用 XML 解析器。

当使用 启用 XML 脚本支持XML 解析器 创建 script 元素时,必须设置其 解析器文档 并将其 force async 设置为 false。如果解析器是作为 XML 片段解析算法 的一部分创建的,则元素的 already started 必须设置为 true。随后解析元素的结束标记时,用户代理必须 执行微任务检查点,然后 准备 script 元素。如果这导致存在 挂起的解析阻塞脚本,则用户代理必须运行以下步骤

  1. 阻止此 XML 解析器 实例,以便 事件循环 不会运行调用它的 任务

  2. 旋转 事件循环,直到解析器的 Document 没有阻止脚本的样式表 并且 挂起的解析阻塞脚本准备由解析器执行 为 true。

  3. 取消阻止此 XML 解析器 实例,以便可以再次运行调用它的 任务

  4. 执行挂起的解析阻塞脚本 给出的脚本元素。

  5. 挂起的解析阻塞脚本 设置为 null。

由于 document.write() API 不适用于 XML 文档,因此 HTML 解析器 中的大部分复杂性在 XML 解析器 中是不需要的。

XML 解析器 禁用 XML 脚本支持 时,不会发生任何这些情况。

XML 解析器 将节点追加到 template 元素时,它必须将其追加到 template 元素的 模板内容DocumentFragment 节点)。

这是对 XML有意违反;不幸的是,XML 无法以 template 处理所需的方式进行正式扩展。 [XML]

XML 解析器 创建 Node 对象时,其 节点文档 必须设置为要将新创建的节点插入其中的节点的 节点文档

本规范中某些算法会逐个字符地向解析器提供字符串。在这种情况下,XML 解析器必须像面对一个由所有这些字符连接而成的单个字符串一样进行处理。

XML 解析器到达其输入的末尾时,它必须停止解析,遵循与HTML 解析器相同的规则。XML 解析器也可以被中止,这同样也必须以与HTML 解析器相同的方式进行。

为了符合性检查的目的,如果确定某个资源符合XML 语法,则它是一个XML 文档

14.3 序列化 XML 片段

针对DocumentElement 节点的XML 片段序列化算法要么返回表示该节点的 XML 片段,要么抛出异常。

对于Document,如果以下列出的错误情况都不适用,则该算法必须返回一个文档实体形式的字符串。文档实体

对于Element,如果以下列出的错误情况都不适用,则该算法必须返回一个内部通用已解析实体形式的字符串。内部通用已解析实体

在这两种情况下,返回的字符串都必须是 XML 命名空间格式良好的,并且必须是该节点所有相关子节点的同构序列化,并按照树序排列。用户代理可以在序列化中调整前缀和命名空间声明(实际上在某些情况下可能被迫这样做才能获得命名空间格式良好的 XML)。用户代理可以使用常规文本和字符引用相结合的方式来表示 DOM 中的Text 节点。

节点的相关子节点是指根据以下规则适用的那些节点。

对于template 元素
相关子节点是template 元素的模板内容(如果有)的子节点。
对于所有其他节点
相关子节点是节点本身的子节点(如果有)。

对于Element,如果序列化中的任何元素都位于无命名空间中,则必须将这些元素的作用域中的默认命名空间显式声明为空字符串。(这在Document 情况下不适用。)[XML] [XMLNS]

出于本节的目的,如果由一个没有命名空间声明且内容为内部通用已解析实体的元素组成的文档本身是 XML 命名空间格式良好的,则该内部通用已解析实体被认为是 XML 命名空间格式良好的。

如果在要序列化的 DOM 子树中发现了以下任何错误情况,则该算法必须抛出一个"InvalidStateError" DOMException,而不是返回字符串。

这些是使 DOM 不可序列化的唯一方法。DOM 会强制执行所有其他 XML 约束;例如,尝试将两个元素追加到Document 节点将抛出一个"HierarchyRequestError" DOMException

14.4 解析 XML 片段

XML 片段解析算法要么返回一个Document,要么抛出一个"SyntaxError" DOMException。给定一个字符串input 和一个上下文元素context,该算法如下所示

  1. 创建一个新的XML 解析器

  2. 向刚刚创建的解析器提供context 元素的开始标记相对应的字符串,声明该元素的 DOM 中作用域内的所有命名空间前缀,以及声明该元素的 DOM 中作用域内的默认命名空间(如果有)。

    如果元素上的 DOM lookupNamespaceURI() 方法针对该前缀返回非空值,则该命名空间前缀位于作用域内。

    默认命名空间是元素上的 DOM isDefaultNamespace() 方法返回 true 的命名空间。

    没有将DOCTYPE 传递给解析器,因此不会引用外部子集,因此不会识别任何实体。

  3. 向刚刚创建的解析器提供字符串input

  4. 向刚刚创建的解析器提供context 元素的结束标记相对应的字符串。

  5. 如果存在 XML 格式良好性错误或 XML 命名空间格式良好性错误,则抛出一个"SyntaxError" DOMException

  6. 如果结果Document文档元素有任何同级节点,则抛出一个"SyntaxError" DOMException

  7. 返回结果Document文档元素的子节点,并按照树序排列。