摘要

本规范定义了各种 API,供 Web 应用以编程方式访问 HTML 和通用 XML 解析器,用于解析 和序列化 DOM 节点。

本文档状态

本节描述本文档在发布时的状态。其他文档可能会 取代本文档。当前 W3C 出版物列表以及本技术报告的最新修订版,可在 W3C 技术报告 索引中找到,地址为 http://www.w3.org/TR/。

本规范基于 DOM 解析与序列化现行标准的原始工作,不过它在 支持的特性、规范性要求和算法具体性方面已经有所分歧。在适当情况下, 来自该现行标准的相关修正会被纳入本文档。

本文档由 Web Platform 工作 组作为工作草案发布。 本文档旨在成为 W3C 推荐标准。 如果你希望对本文档发表评论,请将评论发送至 www-dom@w3.org (订阅, 归档), 并在邮件主题开头写上 DOM-Parsing。 欢迎所有评论。

作为工作草案发布并不意味着获得 W3C 会员的认可。这是一份草案文档,可能会在任何时候被其他 文档更新、替换或废弃。除作为正在进行中的工作外,不应引用本文档。

本文档由 一个工作组 制作,该工作组 根据 2004年2月5日 W3C 专利 政策运作。 W3C 维护一个与该工作组交付物有关的任何专利 披露的公开列表; 该页面还包括 披露专利的说明。任何实际知晓某项专利 且认为该专利包含 必要 权利要求的个人,必须按照 W3C 专利政策第 6 节披露相关信息。

本文档受 2015年9月1日 W3C 流程文档约束。

候选推荐标准 退出准则

在本规范的 测试套件完成,且两个或 更多独立实现通过每项测试之前,本规范不会推进到提议推荐标准,尽管不要求 单个实现必须通过每项测试。我们预计最早不会早于 2014 年 10 月 24 日 满足此准则。该组还将创建一份 实现报告。

1. 一致性

除了标记为非规范性的章节外,本规范中的所有创作指南、图示、示例 和注释均为非规范性。本规范中的其他所有内容都是 规范性的。

作为算法一部分以祈使语气表述的要求 (例如“strip any leading space characters”或“return false and terminate these steps”)应根据引入该 算法时所使用的关键词(“must”、“should”、“may”等)的含义来解释。

以算法或具体步骤表述的一致性要求 可以用任何方式实现,只要最终结果是 等价的。(特别是,本 规范中定义的算法旨在易于理解,而非旨在 具备高性能。)

用户代理可以对原本不受约束的输入 施加实现特定的限制, 例如为了防止拒绝服务攻击、防止耗尽 内存,或绕过平台特定的限制。

当某个方法或属性被称为调用另一个方法或 属性时,用户代理必须调用其用于该 属性或方法的内部 API,以便例如作者不能通过在 ECMAScript 中 用自定义属性或函数覆盖属性或方法来改变其行为。

除非另有说明,字符串比较均以 区分大小写的方式进行。

如果某个算法调用另一个算法,后者抛出的任何异常 (除非被显式捕获)都必须导致前者 终止,并将该异常传播给 其调用者。

1.1 依赖项

本规范中的 IDL 片段必须按照 Web IDL 规范中所描述的符合要求的 IDL 片段来解释。 [WEBIDL]

本规范中使用的一些术语定义于 [DOM4]、[HTML5] 和 [XML10]。

1.2 可扩展性

强烈不鼓励对本规范进行供应商特定的专有扩展。 作者不得使用此类扩展,因为 这样做会降低互操作性并割裂用户群, 使只有特定用户代理的用户才能访问相关内容。

如果需要供应商特定的扩展,则成员应以 供应商特定的字符串作为前缀,以防与本规范的未来 版本发生冲突。扩展的定义必须确保 扩展的使用既不会与规范中定义的功能相矛盾, 也不会导致这些功能 不符合规范。

当需要对本规范进行供应商中立的扩展时, 可以相应更新本规范,或者可以编写 一个扩展规范来覆盖本规范中的 要求。当某个将本 规范应用于其活动的人决定承认 这种扩展规范的要求时,它就成为本 规范中一致性要求目的下的 适用 规范。

2. 术语

术语 上下文对象表示被讨论的 方法或 属性所调用的对象。

3. 命名空间

HTML 命名空间是 http://www.w3.org/1999/xhtml。

XML 命名空间是 http://www.w3.org/XML/1998/namespace。

XMLNS 命名空间是 http://www.w3.org/2000/xmlns/。

4. 解析和序列化 Node

4.1 解析

以下步骤构成 片段 解析算法,其 参数是一个 markup 字符串和一个 context element:

  1. 如果 context element 的 节点文档 是一个 HTML 文档:令 algorithm 为 HTML 片段解析算法。

    如果 context element 的 节点文档 是一个 XML 文档:令 algorithm 为 XML 片段解析算法。

  2. 令 new children 为以 markup 作为 input,并以 context element 作为 上下文 元素来调用 algorithm 的结果。
  3. 令 fragment 为一个新的 DocumentFragment, 其 节点文档 是 context element 的 节点文档。
  4. 将 new children 中的每个 节点 追加到 fragment (按树序)。
    注

    这确保新节点的 节点文档 是正确的。

  5. 返回 fragment 的值。

4.2 序列化

以下步骤构成 片段序列化算法, 其参数是一个 Node node 和一个标志 要求格式良好:

  1. 令 context document 为 node 的 节点文档的值。
  2. 如果 context document 是 HTML 文档, 则返回 node 的一次 HTML 序列化。
  3. 否则,context document 是 XML 文档; 返回 node 的一次 XML 序列化, 并传入标志 require well-formed。
    注

    本文档中定义的 XML 序列化 符合 [HTML5] 中定义的 XML 片段 序列化算法的要求。

要产生一个 Node node 的 HTML 序列化,用户代理 必须在 node 上运行 HTML 片段序列化算法 [HTML5], 并返回所产生的字符串。

要在给定标志 require well-formed 的情况下,产生一个 Node node 的 XML 序列化, 运行以下步骤:

  1. 令 上下文命名空间为 null。 当一个 node 序列化出不同于其父级的默认命名空间定义时,上下文命名空间会发生改变。该 算法假定起始时没有命名空间。
  2. 令 命名空间前缀映射为一个新的映射, 用于关联 namespaceURI 与命名空间 prefix 对,其中 namespaceURI 值是映射的键,prefix 值是 映射的键值。该命名空间前缀 映射 将由此前见过的 namespaceURI 及其在子树中最近的前缀关联填充。 注: 命名空间前缀映射只会把单个 前缀值与给定的 namespaceURI 关联起来。在序列化期间,如果发现不同命名空间前缀 映射到同一 namespaceURI,则最后遇到的那个会通过用新的前缀值替换映射中 现有键值的方式“胜出”。
  3. 用 XML 命名空间键 和字符串 "xml" 作为键值来初始化命名空间前缀映射。
  4. 令 生成的命名空间前缀索引为一个值为 1 的整数。当没有合适的现有 命名空间前缀可用于序列化 node 的 namespaceURI(或 node 的某个属性的 namespaceURI)时,生成的命名空间 前缀索引用于生成一个新的唯一前缀值。参见 生成前缀算法。
  5. 返回在 node 上运行XML 序列化 算法的结果,并传入上下文 命名空间、命名空间前缀 映射、 生成的命名空间前缀索引引用,以及 标志 require well-formed。如果在执行该算法期间发生 异常, 则捕获该异常,并抛出一个名称为 "InvalidStateError" 的 DOMException。

XML 序列化与 HTML 序列化在以下方面不同:

除此之外,用于产生 XML 序列化的算法 被设计为产生与 HTML 解析器兼容的序列化。例如, HTML 命名空间中不包含子节点的元素会被序列化为 显式的开始标签和结束标签,而不是使用自闭合标签语法 [XML10]。

注

根据 [DOM4], Attr 对象不继承自 Node, 因此不能由XML 序列化算法进行序列化。 尝试序列化一个 Attr 对象将导致一个 TypeError 异常 [WEBIDL]。

要在给定上下文命名空间 namespace、命名空间前缀 映射 prefix map、生成的命名空间前缀 索引 prefix index,以及标志 require well-formed 的情况下,在 node 上运行 XML 序列化算法,用户代理必须根据 node 的接口运行相应步骤:

Element

运行以下算法:

  1. 如果require well-formed 标志已设置(其值为 true),且此 node 的 localName 属性包含字符 ":"(U+003A COLON),或不匹配 XML Name 产生式 [XML10],则抛出 异常;此 node 的序列化将不是格式良好的 元素。
  2. 令 markup 为字符串 "<"(U+003C LESS-THAN SIGN)。
  3. 令 qualified name 为空字符串。
  4. 令 skip end tag 标志的值为 false。
  5. 令 ignore namespace definition attribute 标志的值为 false。
  6. 令 map 为 prefix map 的副本。
  7. 令 element prefixes list 为空列表。此列表 对每个元素是局部的。其目的是确保在需要生成新的命名空间前缀属性时 不会有冲突的前缀。
  8. 令 duplicate prefix definition 为 null。
  9. 令 local default namespace 为在给定 map、element prefixes list 和 duplicate prefix definition 的情况下,为 node 记录命名空间信息的结果。
    注

    上述步骤会用任何找到的命名空间 前缀 定义更新 map,将找到的前缀定义添加到 element prefixes list,可选地 设置 duplicate prefix definition 值,并返回由默认命名空间属性定义的局部默认 命名空间 值(如果存在)。否则它返回 null。

  10. 令 inherited ns 为 namespace 的副本。
  11. 令 ns 为 node 的 namespaceURI 属性的值。
  12. 如果 inherited ns 等于 ns,则:
    1. 如果 local default namespace 不为 null,则将 ignore namespace definition attribute 设为 true。
    2. 如果 ns 是 XML 命名空间,则令 qualified name 为字符串 "xml:" 与 node 的 localName 的值的连接。
    3. 否则,令 qualified name 为 node 的 localName 的值。 node 的前缀始终会被丢弃。
    4. 将 qualified name 的值追加到 markup。
  13. 否则,inherited ns 不等于 ns(node 自身的 命名空间不同于其父级的上下文命名空间)。运行这些子步骤:
    1. 令 prefix 为 node 的 prefix 属性的值。
    2. 令 candidate prefix 为来自 map 的一个值,其中 map 中存在一个键 匹配 ns 的值;如果不存在这样的键,则令 candidate prefix 为 null。
    3. 如果 candidate prefix 不为 null(已定义一个映射到 ns 的合适命名空间前缀),则:
      1. 令 qualified name 为 candidate prefix、 ":"(U+003A COLON)以及 node 的 localName 的连接。 在此 node 或该 node 的祖先上存在一个 命名空间前缀定义,该定义定义了 node 的 命名空间。
      2. 如果 local default namespace 不为 null(存在 一个局部定义的 默认命名空间声明属性),则令 inherited ns 取得 ns 的值。
      3. 将 qualified name 的值追加到 markup。
    4. 否则,如果 prefix 不为 null 且 local default namespace 为 null,则:
      1. 如果 element prefixes list 包含 prefix 的值,则 令 prefix 为在提供以下输入的情况下 生成前缀的结果: 命名空间前缀映射 map、 node 的 ns 字符串,以及 prefix index 整数。
      2. 否则,向 map 追加一个新键 ns,其键值 是 prefix。
      3. 令 qualified name 为 prefix、":"(U+003A COLON)以及 node 的 localName 的连接。
      4. 将 qualified name 的值追加到 markup。
      5. 按所列顺序将以下内容追加到 markup:以下步骤会 序列化刚添加到 map 的新命名空间/前缀关联。
        1. " "(U+0020 SPACE);
        2. 字符串 "xmlns:";
        3. prefix 的值;
        4. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        5. 以 ns 和require well-formed 标志 作为输入,序列化属性 值的结果;
        6. """(U+0022 QUOTATION MARK)。
    5. 否则,如果 local default namespace 为 null,或 local default namespace 不为 null 且其值不等于 ns,则:
      1. 将 ignore namespace definition attribute 标志设为 true。
      2. 令 qualified name 为 node 的 localName 的值。
      3. 令 inherited ns 的值为 ns。新的 默认命名空间将在序列化中用于定义此 node 的 命名空间,并作为其子节点的上下文命名空间。
      4. 将 qualified name 的值追加到 markup。
      5. 按所列顺序将以下内容追加到 markup:以下步骤会 序列化新的(或替换的)默认命名空间定义。
        1. " "(U+0020 SPACE);
        2. 字符串 "xmlns";
        3. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
        4. 以 ns 和require well-formed 标志 作为输入,序列化属性 值的结果;
        5. """(U+0022 QUOTATION MARK)。
    6. 否则,node 拥有一个匹配 ns 的 local default namespace。令 qualified name 为 node 的 localName 的值, 令 inherited ns 的值为 ns,并将 qualified name 的值追加到 markup。
  14. 将 在给定命名空间前缀映射 map、 生成的前缀索引 prefix index、 标志 ignore namespace definition attribute 以及 duplicate prefix definition 的值的情况下得到的 node 的 属性的 XML 序列化结果追加到 markup。
  15. 如果 ns 是 HTML 命名空间, 且 node 的 子节点 列表为空,且 node 的 localName 匹配以下任一 空元素: "area"、 "base"、 "basefont"、 "bgsound"、 "br"、 "col"、 "embed"、 "frame"、 "hr"、 "img"、 "input"、 "keygen"、 "link"、 "menuitem"、 "meta"、 "param"、 "source"、 "track"、 "wbr"; 则按所列顺序将以下内容追加到 markup:
    1. " "(U+0020 SPACE);
    2. "/"(U+002F SOLIDUS)。
    并将 skip end tag 标志设为 true。
  16. 如果 ns 不是 HTML 命名空间, 且 node 的 子节点 列表为空,则将 "/"(U+002F SOLIDUS)追加到 markup, 并将 skip end tag 标志设为 true。
  17. 将 ">"(U+003E GREATER-THAN SIGN)追加到 markup。
  18. 如果 skip end tag 的值为 true,则返回 markup 的值,并跳过剩余步骤。该 node 是一个叶节点。
  19. 如果 ns 是 HTML 命名空间,且 node 的 localName 匹配字符串 "template",则这是一个 template 元素。 将在 template 元素的 template 内容 (一个 DocumentFragment) 上运行 XML 序列化算法的结果 追加到 markup, 并为 上下文命名空间提供 inherited ns 的值, 为命名空间 前缀映射提供 map, 为 生成的命名空间前缀索引提供 prefix index,并提供 require well-formed 标志的值。 在给定 解析 XHTML 文档 规则的情况下,这允许 template 内容往返 [HTML5]。
  20. 否则,将在 node 的每个 子节点上 按树序运行 XML 序列化算法的结果追加到 markup, 并为 上下文命名空间提供 inherited ns 的值, 为命名空间 前缀映射提供 map, 为 生成的命名空间前缀索引提供 prefix index,并提供 require well-formed 标志的值。
  21. 按所列顺序将以下内容追加到 markup:
    1. "</"(U+003C LESS-THAN SIGN, U+002F SOLIDUS);
    2. qualified name 的值;
    3. ">"(U+003E GREATER-THAN SIGN)。
  22. 返回 markup 的值。
Document

如果require well-formed 标志已设置(其值为 true),且此 node 没有 documentElement ( documentElement 属性的值为 null),则抛出 异常;此 node 的序列化将不是格式良好的 文档。

否则,运行以下步骤:

  1. 令 serialized document 为空字符串。
  2. 如果 node 的 doctype 属性不为 null,则在提供 require well-formed 标志的情况下, 将为 node 的 doctype 属性产生 DocumentType 序列化的步骤 所产生的字符串追加到 serialized document。
  3. 对于 node 的每个子节点 child,按 树序,在给定上下文 命名空间 namespace、命名空间 前缀映射 prefix map、对生成的 命名空间前缀索引 prefix index 的引用、标志 require well-formed 的情况下,在 child 上运行 XML 序列化算法, 并将结果追加到 serialized document。
  4. 返回 serialized document 的值。
Comment

如果require well-formed 标志已设置(其值为 true),且 node 的 data 包含不匹配 XML Char 产生式的字符 [XML10],或 包含 "--"(两个相邻的 U+002D HYPHEN-MINUS 字符),或以 "-"(U+002D HYPHEN-MINUS)字符结尾,则 抛出异常;此 node 的 data 的序列化将不是格式良好的。

返回 "<!--"、node 的 data 和 "-->" 的连接。

Text
  1. 如果require well-formed 标志已设置(其值为 true),且 node 的 data 包含不匹配 XML Char 产生式的字符 [XML10], 则抛出异常;此 node 的 data 的序列化将不是格式良好的。
  2. 令 markup 为 node 的 data 的值。
  3. 将 markup 中出现的任何 "&" 替换为 "&amp;"。
  4. 将 markup 中出现的任何 "<" 替换为 "&lt;"。
  5. 将 markup 中出现的任何 ">" 替换为 "&gt;"。
  6. 返回 markup 的值。
DocumentFragment
  1. 令 markup 为空字符串。
  2. 对于 node 的每个子节点 child,按 树序, 在给定上下文命名空间 namespace、 命名空间前缀映射 prefix map、 对生成的 命名空间前缀索引 prefix index 的引用,以及标志 require well-formed 的情况下, 在 child 上运行XML 序列化算法。 将结果连接到 markup。
  3. 返回 markup 的值。
DocumentType
运行在给定require well-formed 标志的情况下,为 node 产生 DocumentType 序列化的步骤,并返回其所产生的字符串。
ProcessingInstruction
  1. 如果require well-formed 标志已设置(其值为 true),且 node 的 target 包含一个 ":"(U+003A COLON)字符,或与字符串 "xml" 进行 ASCII 不区分大小写 匹配,则抛出 异常;此 node 的 target 的序列化将不是格式良好的。
  2. 如果require well-formed 标志已设置(其值为 true),且 node 的 data 包含不匹配 XML Char 产生式的字符 [XML10],或 包含字符串 "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN), 则抛出异常;此 node 的 data 的序列化将不是格式良好的。
  3. 令 markup 为按所列顺序连接以下内容所得的字符串:
    1. "<?"(U+003C LESS-THAN SIGN, U+003F QUESTION MARK);
    2. node 的 target 的值;
    3. " "(U+0020 SPACE);
    4. node 的 data 的值;
    5. "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN)。
  4. 返回 markup 的值。

要在给定 require well-formed 标志的情况下,为一个 Node node 产生 DocumentType 序列化, 用户代理必须返回以下算法的结果:

  1. 如果require well-formed 标志为 true, 且 node 的 publicId 属性包含不匹配 XML PubidChar 产生式的字符 [XML10],则抛出异常;此 node 的序列化将不是格式良好的文档类型声明。
  2. 如果require well-formed 标志为 true, 且 node 的 systemId 属性包含不匹配 XML Char 产生式的字符 [XML10],或同时包含 """(U+0022 QUOTATION MARK)和 "'" (U+0027 APOSTROPHE),则抛出 异常;此 node 的序列化将不是格式良好的文档类型声明。
  3. 令 markup 为空字符串。
  4. 将字符串 "<!DOCTYPE" 追加到 markup。
  5. 将 " "(U+0020 SPACE)追加到 markup。
  6. 将 node 的 name 属性的值追加到 markup。对于属于 HTML 文档的 node, 该值将全为小写。
  7. 如果 node 的 publicId 不是空字符串,则按所列顺序将以下内容追加到 markup:
    1. " "(U+0020 SPACE);
    2. 字符串 "PUBLIC";
    3. " "(U+0020 SPACE);
    4. """(U+0022 QUOTATION MARK);
    5. node 的 publicId 属性的值;
    6. """(U+0022 QUOTATION MARK)。
  8. 如果 node 的 systemId 不是空字符串,且 node 的 publicId 被设为空字符串,则按所列顺序将以下内容追加到 markup:
    1. " "(U+0020 SPACE);
    2. 字符串 "SYSTEM"。
  9. 如果 node 的 systemId 不是空字符串,则按所列顺序将以下内容追加到 markup:
    1. " "(U+0020 SPACE);
    2. """(U+0022 QUOTATION MARK);
    3. node 的 systemId 属性的值;
    4. """(U+0022 QUOTATION MARK)。
  10. 将 ">"(U+003E GREATER-THAN SIGN)追加到 markup。
  11. 返回 markup 的值。

要在给定 命名空间前缀映射 map、一个 element prefixes list(初始为空)以及一个 duplicate prefix definition 引用的情况下,为一个 Element element 记录命名空间信息, 用户代理必须运行以下步骤:

  1. 令 default namespace attr value 为 null。
  2. Main: 对 element 的 attributes 中的每个属性 attr, 按其在 element 的 属性列表中指定的顺序:
    注

    以下条件步骤会将命名空间前缀 添加到 element prefixes list 中,并在 map 中添加或替换它们。 只考虑 XMLNS 命名空间中的属性 (例如,通过 setAttribute("xmlns:pretend-prefix", "pretend-namespace") 制作得看起来像命名空间声明的属性不会被包括在内)。

    1. 令 attribute namespace 为 attr 的 namespaceURI 值。
    2. 令 attribute prefix 为 attr 的 prefix 的值。
    3. 如果 attribute namespace 是 XMLNS 命名空间,则:
      1. 如果 attribute prefix 为 null,则 attr 是 一个默认命名空间声明。将 default namespace attr value 设为 attr 的 value, 并停止运行这些步骤,返回到 Main 以访问下一个属性。
      2. 否则,attribute prefix 不为 null,且 attr 是一个命名空间前缀定义。运行以下步骤:
        1. 令 prefix definition 为 attr 的 localName 的值。
        2. 令 namespace definition 为 attr 的 value 的值。
        3. 如果 map 中已经存在一个匹配 namespace definition 值的键, 且该键的值匹配 prefix definition, 则 这是一个重复的命名空间前缀定义。将 duplicate prefix definition 的值设为 prefix definition。
        4. 否则,如果 map 中已经存在匹配 namespace definition 值的键, 但该键的值不匹配 prefix definition, 则将该键的值更新为 prefix definition。
        5. 否则,不存在匹配 namespace definition 值的键; 向 map 追加一个新键 namespace definition, 其键值为 prefix definition。
        6. 将 prefix definition 的值追加到 element prefixes list。
  3. 返回 default namespace attr value 的值。

要在给定 命名空间前缀映射 map、一个 字符串 new namespace,以及对 生成的命名空间前缀索引 prefix index 的引用的情况下,生成 前缀,用户代理必须运行以下步骤:

  1. 令 generated prefix 为字符串 "ns" 与 prefix index 的当前数值的连接。
  2. 令 prefix index 的值递增一。
  3. 向 map 追加一个新键 new namespace,其键值为 generated prefix。
  4. 返回 generated prefix 的值。

一个 Element element 的 属性的 XML 序列化, 连同一个命名空间前缀 映射 map、一个生成的前缀索引 prefix index 引用、一个标志 ignore namespace definition attribute、一个 duplicate prefix definition 值,以及一个标志 require well-formed, 是以下算法的结果:

  1. 令 result 为空字符串。
  2. 令 localname set 为一个新的空 命名空间 localname 集。此 localname set 将包含唯一属性的 namespaceURI 和 localName 对的元组,并在处理每个 attr 时被填充。 此集合用于[可选地]强制执行格式良好约束,即 一个元素不能有两个具有相同 namespaceURI 和 localName 的属性。 当同一元素上的两个本来相同的属性仅前缀值不同时,可能发生这种情况。
  3. Main:对 element 的 attributes 中的每个属性 attr, 按其在 element 的 属性列表中指定的顺序:
    1. 如果require well-formed 标志已设置(其值为 true),且 localname set 包含一个元组,其值匹配 一个由 attr 的 namespaceURI 属性和 localName 属性组成的新元组的值,则抛出 异常;此 attr 的序列化将无法产生格式良好的元素序列化。
    2. 创建一个由 attr 的 namespaceURI 属性和 localName 属性组成的新元组,并将其添加到 localname set。
    3. 令 attribute namespace 为 attr 的 namespaceURI 值。
    4. 令 candidate prefix 为 null。
    5. 如果 attribute namespace 不为 null,则运行这些子步骤:
      1. 如果 attribute namespace 的值是 XMLNS 命名空间,且满足以下任一条件: attr 的 prefix 为 null 且 ignore namespace definition attribute 标志为 true,或 attr 的 prefix 不为 null 且 attr 的 localName 匹配 duplicate prefix definition 的值,则停止运行 这些步骤,并转到 Main 以访问下一个属性。
      2. 否则,如果 map 中存在一个匹配 attribute namespace 值的键,则令 candidate prefix 为 map 中该键的值。
      3. 否则,map 中没有匹配 attribute namespace 的键, 且 attribute namespace 不是 XMLNS 命名空间。 运行这些步骤:
        1. 令 candidate prefix 为在提供 map、 attribute namespace 和 prefix index 作为输入的情况下 生成前缀的结果。
        2. 按所列顺序将以下内容追加到 result:
          1. " "(U+0020 SPACE);
          2. 字符串 "xmlns:";
          3. candidate prefix 的值;
          4. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
          5. 以 attribute namespace 和 require well-formed 标志作为 输入,序列化属性 值的结果;
          6. """(U+0022 QUOTATION MARK)。
    6. 将一个 " "(U+0020 SPACE)追加到 result。
    7. 如果 candidate prefix 不为 null,则将 candidate prefix 与 ":"(U+003A COLON)的连接追加到 result。
    8. 如果require well-formed 标志已设置(其值为 true),且此 attr 的 localName 属性包含字符 ":"(U+003A COLON),或不匹配 XML Name 产生式 [XML10],或 等于 "xmlns" 且 attribute namespace 为 null,则抛出 异常;此 attr 的序列化将不是格式良好的 属性。
    9. 按所列顺序将以下字符串追加到 result:
      1. attr 的 localName 的值;
      2. "=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
      3. 以 attr 的 value 属性和require well-formed 标志作为输入,序列化属性值的结果;
      4. """(U+0022 QUOTATION MARK)。
  4. 返回 result 的值。

要在给定一个 attribute value 和require well-formed 标志的情况下, 序列化属性值, 用户代理必须运行以下步骤:

  1. 如果require well-formed 标志已设置(其值为 true),且 attribute value 包含不匹配 XML Char 产生式的字符 [XML10],则 抛出异常;此 attribute value 的序列化将无法产生格式良好的元素序列化。
  2. 如果 attribute value 为 null,则返回空字符串。
  3. 否则,attribute value 是一个字符串。返回 attribute value 的值,先将以下任何出现项替换:
    1. 将 """ 替换为 "&quot;"
    2. 将 "&" 替换为 "&amp;"
    3. 将 "<" 替换为 "&lt;"
    4. 将 ">" 替换为 "&gt;"
    注

    这与浏览器中存在的行为相匹配,并且超出了 XML 规范的 AttValue 产生式 [XML10] 中的语法要求, 还会替换 ">" 字符。

5. DOMParser 接口

enum SupportedType {
    "text/html",
    "text/xml",
    "application/xml",
    "application/xhtml+xml",
    "image/svg+xml"
};

DOMParser() 构造函数 必须返回一个新的 DOMParser 对象。

[Constructor]
interface DOMParser {
    [NewObject]
    Document parseFromString (DOMString str, SupportedType type);
};

5.1 方法

parseFromString

parseFromString(str, type) 方法必须根据 type 运行以下步骤:

"text/html"

用一个 HTML 解析器解析 str, 并返回新 创建的文档。

脚本标志必须设为 "disabled"。

注

meta 元素不会被 纳入所用编码的考虑,因为传给 解析器的是 Unicode 流。

注

script 元素会被标记为 不可执行,且 noscript 的内容会作为标记来解析。

"text/xml"
"application/xml"
"application/xhtml+xml"
"image/svg+xml"
  1. 用启用命名空间的 XML 解析器解析 str。
    注

    对于所有使用 XML 解析器 解析的 XHTML script 元素, 等同于脚本标志的内容必须 设为 "disabled"。

  2. 如果上一步没有返回错误,则返回新 创建的文档。
  3. 令 document 为一个新创建的 XML Document。 document 将使用 Document 接口, 而不是 XMLDocument 接口。
  4. 令 root 为一个新的 Element, 其 局部名 设为 "parsererror",并且其 命名空间 设为 "http://www.mozilla.org/newlayout/xml/parsererror.xml"。

    此时,用户代理可以 向 root 追加节点, 例如用于描述错误的性质。

  5. 将 root 追加到 document。
  6. 返回 document 的值。

无论哪种情况,返回的 文档的 内容类型 必须是 type 参数。此外,该 文档必须具有一个 URL 值,其等于 活动文档的 URL,并且 location 值为 null。

注

返回的 文档的 编码是 默认值 UTF-8。

参数 类型 可为空 可选 描述
str DOMString ✘ ✘
type SupportedType ✘ ✘
返回类型:Document

6. XMLSerializer 接口

XMLSerializer() 构造函数必须返回一个新的 XMLSerializer 对象。

[Constructor]
interface XMLSerializer {
    DOMString serializeToString (Node root);
};

6.1 方法

serializeToString
serializeToString(root) 方法必须在为 require well-formed 参数传入值 false 的情况下, 产生 root 的 XML 序列化, 并返回结果。
参数 类型 可为空 可选 描述
root Node ✘ ✘
返回类型:DOMString

7. Element 接口扩展

partial interface Element {
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString innerHTML;
    [CEReactions, TreatNullAs=EmptyString]
                    attribute DOMString outerHTML;
    [CEReactions]
    void insertAdjacentHTML (DOMString position, DOMString text);
};

7.1 属性

innerHTML,类型为 DOMString

innerHTML IDL 属性表示 Element 内容的标记。

element . innerHTML [ = value ]

返回表示该元素 内容的一段 HTML 或 XML 片段。

可以设置,以用从给定字符串解析出的节点 替换该元素的内容。

在 XML 文档的情况下, 如果 Element 无法序列化 为 XML,则会抛出一个名称为 "InvalidStateError" 的 DOMException; 如果给定字符串不是格式良好的,则会抛出一个名称为 "SyntaxError" 的 DOMException。

获取时,返回在 上下文对象上调用 片段序列化算法的结果,并为 require well-formed 标志提供 true (这可能会抛出异常,而不是返回字符串)。

设置时,必须运行以下步骤:

  1. 令 fragment 为调用 片段解析算法的结果,其中 新值作为 markup,并且 上下文对象作为 context element。
  2. 在上下文对象内 用 fragment 替换全部。
outerHTML,类型为 DOMString

outerHTML IDL 属性表示 Element 及其内容的标记。

element . outerHTML [ = value ]

返回表示该元素及其 内容的一段 HTML 或 XML 片段。

可以设置,以用从给定 字符串解析出的节点替换该元素。

在 XML 文档的情况下, 如果该元素无法序列化为 XML,则会抛出一个名称为 "InvalidStateError" 的 DOMException; 如果给定字符串不是格式良好的,则会抛出一个名称为 "SyntaxError" 的 DOMException。

如果该元素的父节点是 Document 节点,则抛出一个名称为 "NoModificationAllowedError" 的 DOMException。

获取时,返回在一个虚构节点上调用 片段序列化算法的结果, 该虚构节点唯一的子节点是 上下文对象, 并为 require well-formed 标志提供 true(这可能会抛出异常,而不是返回字符串)。

设置时,必须运行以下步骤:

  1. 令 parent 为上下文对象的 父节点。
  2. 如果 parent 为 null,则终止这些步骤。即使运行剩余步骤, 也没有办法取得对所创建节点的引用。
  3. 如果 parent 是一个 Document, 则抛出一个名称为 "NoModificationAllowedError" 的 DOMException 异常。
  4. 如果 parent 是一个 DocumentFragment, 则令 parent 为一个新的 Element, 并具有
  5. 令 fragment 为调用 片段解析算法的结果,其中 新值作为 markup,并且 parent 作为 context element。
  6. 在上下文对象的 父节点内, 用 fragment 替换 上下文对象。

7.2 方法

insertAdjacentHTML
element . insertAdjacentHTML(position, text)

将给定字符串 text 解析为 HTML 或 XML,并将 所得节点插入树中由 position 参数给定的位置,如下所示:

"beforebegin"
在该元素自身之前。
"afterbegin"
刚好在该元素内部、其第一个子节点之前。
"beforeend"
刚好在该元素内部、其最后一个子节点之后。
"afterend"
在该元素自身之后。

如果参数具有无效值(例如,在 XML 文档的情况下,给定字符串 不是格式良好的),则抛出一个名称为 "SyntaxError" 的 DOMException。

如果给定位置不可行(例如,在 Document 的根元素之后插入元素),则抛出一个名称为 "NoModificationAllowedError" 的 DOMException。

insertAdjacentHTML(position, text) 方法必须运行以下步骤:

  1. 使用此列表中的第一个匹配项:
    如果 position 与 字符串 "beforebegin" 进行 ASCII 不区分大小写匹配
    如果 position 与 字符串 "afterend" 进行 ASCII 不区分大小写匹配

    令 context 为上下文对象的 父节点。

    如果 context 为 null 或是一个 文档,则抛出 一个名称为 "NoModificationAllowedError" 的 DOMException。

    如果 position 与 字符串 "afterbegin" 进行 ASCII 不区分大小写匹配
    如果 position 与 字符串 "beforeend" 进行 ASCII 不区分大小写匹配
    令 context 为上下文对象。
    否则

    抛出一个名称为 "SyntaxError" 的 DOMException。

  2. 如果 context 不是 Element, 或以下条件均为真:

    则令 context 为一个新的 Element, 并具有

  3. 令 fragment 为调用 片段解析算法的结果,其中 text 作为 markup,并且 context 作为 context element。
  4. 使用此列表中的第一个匹配项:
    如果 position 与 字符串 "beforebegin" 进行 ASCII 不区分大小写匹配
    将 fragment 插入到上下文对象的 父节点中, 位于上下文对象之前。
    如果 position 与 字符串 "afterbegin" 进行 ASCII 不区分大小写匹配
    将 fragment 插入到 上下文对象中, 位于其 第一个子节点之前。
    如果 position 与 字符串 "beforeend" 进行 ASCII 不区分大小写匹配
    将 fragment 追加到 上下文对象。
    如果 position 与 字符串 "afterend" 进行 ASCII 不区分大小写匹配
    将 fragment 插入到上下文对象的 父节点中, 位于上下文对象的 下一个兄弟节点之前。
参数 类型 可为空 可选 描述
position DOMString ✘ ✘
text DOMString ✘ ✘
返回类型:void

8. Range 接口扩展

partial interface Range {
    [CEReactions, NewObject]
    DocumentFragment createContextualFragment (DOMString fragment);
};

8.1 方法

createContextualFragment
docFragment = range . createContextualFragment(markupString)
返回一个由给定标记字符串创建的 DocumentFragment。

createContextualFragment(fragment) 方法必须运行以下步骤:

  1. 令 node 为上下文对象的 起始节点。

    根据 node 的接口,令 element 如下:

    Document
    DocumentFragment
    null
    Element
    node
    Text
    Comment
    node 的 父元素
    DocumentType
    ProcessingInstruction
    [DOM4] 会防止这种情况发生。
  2. 如果 element 为 null,或者以下条件均为真:

    则令 element 为一个新的 元素,并具有

  3. 令 fragment node 为调用 片段解析算法的结果,其中 fragment 作为 markup,并且 element 作为 context element。
  4. 取消 fragment node 中所有脚本的 "already started" 标记。
  5. 返回 fragment node 的值。
参数 类型 可为空 可选 描述
fragment DOMString ✘ ✘
返回类型:DocumentFragment

A. 修订历史

以下是自本规范上次发布以来所作更改的资料性摘要。 本规范编辑者草案的完整修订历史 可在这里找到。

B. 致谢

感谢 Ms2ger [Mozilla] 维护本规范的初始 草案,并在 现行标准中持续改进它。

感谢 Victor Costan、 Aryeh Gregor、 Anne van Kesteren、 Arkadiusz Michalski、 Simon Pieters、 Henri Sivonen、 Josh Soref 和 Boris Zbarsky 提供有用的评论。

特别感谢 Ian Hickson 在 [HTML5] 中定义 innerHTML 和 outerHTML 属性,以及 insertAdjacentHTML() 方法,并感谢他提供有用的评论。

C. 参考文献

C.1 规范性参考文献

[HTML5]
Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Silvia Pfeiffer. W3C. HTML5. 2014年10月28日。W3C 推荐标准。 URL:http://www.w3.org/TR/html5/
[RFC2119]
S. Bradner. IETF. RFC 中用于表示要求级别的 关键词. 1997年3月。最佳当前实践。 URL:https://tools.ietf.org/html/rfc2119
[WEBIDL]
Cameron McCormack; Boris Zbarsky. W3C. WebIDL Level 1. 2016年3月8日。W3C 候选推荐标准。URL:http://www.w3.org/TR/WebIDL-1/

C.2 资料性参考文献

[DOM4]
Anne van Kesteren; Aryeh Gregor; Ms2ger; Alex Russell; Robin Berjon. W3C. W3C DOM4. 2015年11月19日。W3C 推荐标准。 URL:http://www.w3.org/TR/dom/
[XML10]
Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau et al. W3C. 可扩展标记语言(XML) 1.0(第五版). 2008年11月26日。W3C 推荐标准。URL:http://www.w3.org/TR/xml