摘要

本规范定义了各种 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 文档:令 algorithmHTML 片段解析算法

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

  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 documentnode节点文档的值。
  2. 如果 context documentHTML 文档, 则返回 node 的一次 HTML 序列化
  3. 否则,context documentXML 文档; 返回 node 的一次 XML 序列化, 并传入标志 require well-formed

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

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

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

  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),且此 nodelocalName 属性包含字符 ":"(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. mapprefix map 的副本。
  7. element prefixes list 为空列表。此列表 对每个元素是局部的。其目的是确保在需要生成新的命名空间前缀属性时 不会有冲突的前缀。
  8. duplicate prefix definitionnull
  9. local default namespace 为在给定 mapelement prefixes listduplicate prefix definition 的情况下,为 node 记录命名空间信息的结果。

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

  10. inherited nsnamespace 的副本。
  11. nsnodenamespaceURI 属性的值。
  12. 如果 inherited ns 等于 ns,则:
    1. 如果 local default namespace 不为 null,则将 ignore namespace definition attribute 设为 true
    2. 如果 nsXML 命名空间,则令 qualified name 为字符串 "xml:" 与 nodelocalName 的值的连接。
    3. 否则,令 qualified namenodelocalName 的值。 node 的前缀始终会被丢弃。
    4. qualified name 的值追加到 markup
  13. 否则,inherited ns 不等于 nsnode 自身的 命名空间不同于其父级的上下文命名空间)。运行这些子步骤:
    1. prefixnodeprefix 属性的值。
    2. candidate prefix 为来自 map 的一个值,其中 map 中存在一个键 匹配 ns 的值;如果不存在这样的键,则令 candidate prefixnull
    3. 如果 candidate prefix 不为 null(已定义一个映射到 ns 的合适命名空间前缀),则:
      1. qualified namecandidate prefix、 ":"(U+003A COLON)以及 node localName 的连接。 在此 node 或该 node 的祖先上存在一个 命名空间前缀定义,该定义定义了 node 的 命名空间。
      2. 如果 local default namespace 不为 null(存在 一个局部定义的 默认命名空间声明属性),则令 inherited ns 取得 ns 的值。
      3. qualified name 的值追加到 markup
    4. 否则,如果 prefix 不为 nulllocal default namespacenull,则:
      1. 如果 element prefixes list 包含 prefix 的值,则 令 prefix 为在提供以下输入的情况下 生成前缀的结果: 命名空间前缀映射 mapnodens 字符串,以及 prefix index 整数。
      2. 否则,向 map 追加一个新键 ns,其键值 是 prefix
      3. qualified nameprefix、":"(U+003A COLON)以及 nodelocalName 的连接。
      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. nsrequire well-formed 标志 作为输入,序列化属性 值的结果;
        6. """(U+0022 QUOTATION MARK)。
    5. 否则,如果 local default namespacenull,或 local default namespace 不为 null 且其值不等于 ns,则:
      1. ignore namespace definition attribute 标志设为 true
      2. qualified namenodelocalName 的值。
      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. nsrequire well-formed 标志 作为输入,序列化属性 值的结果;
        5. """(U+0022 QUOTATION MARK)。
    6. 否则,node 拥有一个匹配 nslocal default namespace。令 qualified namenodelocalName 的值, 令 inherited ns 的值为 ns,并将 qualified name 的值追加到 markup
  14. 将 在给定命名空间前缀映射 map生成的前缀索引 prefix index、 标志 ignore namespace definition attribute 以及 duplicate prefix definition 的值的情况下得到的 node 的 属性的 XML 序列化结果追加到 markup
  15. 如果 nsHTML 命名空间, 且 node子节点 列表为空,且 nodelocalName 匹配以下任一 空元素: "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. 如果 nsHTML 命名空间,且 nodelocalName 匹配字符串 "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 没有 documentElementdocumentElement 属性的值为 null),则抛出 异常;此 node 的序列化将不是格式良好的 文档。

否则,运行以下步骤:

  1. serialized document 为空字符串。
  2. 如果 nodedoctype 属性不为 null,则在提供 require well-formed 标志的情况下, 将为 nodedoctype 属性产生 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),且 nodedata 包含不匹配 XML Char 产生式的字符 [XML10],或 包含 "--"(两个相邻的 U+002D HYPHEN-MINUS 字符),或以 "-"(U+002D HYPHEN-MINUS)字符结尾,则 抛出异常;此 nodedata 的序列化将不是格式良好的。

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

Text
  1. 如果require well-formed 标志已设置(其值为 true),且 nodedata 包含不匹配 XML Char 产生式的字符 [XML10], 则抛出异常;此 nodedata 的序列化将不是格式良好的。
  2. markupnodedata 的值。
  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),且 nodetarget 包含一个 ":"(U+003A COLON)字符,或与字符串 "xml" 进行 ASCII 不区分大小写 匹配,则抛出 异常;此 nodetarget 的序列化将不是格式良好的。
  2. 如果require well-formed 标志已设置(其值为 true),且 nodedata 包含不匹配 XML Char 产生式的字符 [XML10],或 包含字符串 "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN), 则抛出异常;此 nodedata 的序列化将不是格式良好的。
  3. markup 为按所列顺序连接以下内容所得的字符串:
    1. "<?"(U+003C LESS-THAN SIGN, U+003F QUESTION MARK);
    2. nodetarget 的值;
    3. " "(U+0020 SPACE);
    4. nodedata 的值;
    5. "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN)。
  4. 返回 markup 的值。

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

  1. 如果require well-formed 标志为 true, 且 nodepublicId 属性包含不匹配 XML PubidChar 产生式的字符 [XML10],则抛出异常;此 node 的序列化将不是格式良好的文档类型声明。
  2. 如果require well-formed 标志为 true, 且 nodesystemId 属性包含不匹配 XML Char 产生式的字符 [XML10],或同时包含 """(U+0022 QUOTATION MARK)和 "'" (U+0027 APOSTROPHE),则抛出 异常;此 node 的序列化将不是格式良好的文档类型声明。
  3. markup 为空字符串。
  4. 将字符串 "<!DOCTYPE" 追加到 markup
  5. 将 " "(U+0020 SPACE)追加到 markup
  6. nodename 属性的值追加到 markup。对于属于 HTML 文档node, 该值将全为小写。
  7. 如果 nodepublicId 不是空字符串,则按所列顺序将以下内容追加到 markup
    1. " "(U+0020 SPACE);
    2. 字符串 "PUBLIC";
    3. " "(U+0020 SPACE);
    4. """(U+0022 QUOTATION MARK);
    5. nodepublicId 属性的值;
    6. """(U+0022 QUOTATION MARK)。
  8. 如果 nodesystemId 不是空字符串,且 nodepublicId 被设为空字符串,则按所列顺序将以下内容追加到 markup
    1. " "(U+0020 SPACE);
    2. 字符串 "SYSTEM"。
  9. 如果 nodesystemId 不是空字符串,则按所列顺序将以下内容追加到 markup
    1. " "(U+0020 SPACE);
    2. """(U+0022 QUOTATION MARK);
    3. nodesystemId 属性的值;
    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 valuenull
  2. Main: 对 elementattributes 中的每个属性 attr, 按其在 element属性列表中指定的顺序:

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

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

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

  1. 如果require well-formed 标志已设置(其值为 true),且 attribute value 包含不匹配 XML Char 产生式的字符 [XML10],则 抛出异常;此 attribute value 的序列化将无法产生格式良好的元素序列化。
  2. 如果 attribute valuenull,则返回空字符串。
  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 Documentdocument 将使用 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] 中定义 innerHTMLouterHTML 属性,以及 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