摘要

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

本文档状态

本节描述了本文档发布时的状态。其他文档可能会取代本文档。当前的 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 技术报告索引(网址:https://w3org.cn/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. 一致性

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

在算法中使用的祈使句(例如“去除任何前导空格字符”或“返回 false 并终止这些步骤”)应依据引入该算法时使用的关键字(“必须”、“应当”、“可以”等)来解释其含义。

以算法或具体步骤表述的一致性要求可以以任何方式实现,只要最终结果等效即可。(特别说明,本规范中定义的算法旨在易于遵循,而非旨在达到高性能。)

用户代理可能会对本来无限制的输入施加实现特定的限制,例如防止拒绝服务攻击、避免内存耗尽,或规避平台特有的限制。

当说某个方法或属性调用另一个方法或属性时,用户代理必须调用该属性或方法的内部 API,以防止作者通过在 ECMAScript 中用自定义属性或函数覆盖属性或方法来改变行为。

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

如果一个算法调用另一个算法,而后者抛出异常(除非被显式捕获),则必须导致前者终止,并将该异常向上抛至调用者。

1.1 依赖项

本规范中的 IDL 片段必须按照 Web IDL 规范中对符合要求的 IDL 片段的解释进行解释。[WEBIDL]

本规范中使用的一些术语在 [DOM4]、[HTML5]、以及 [XML10] 中有定义。

1.2 可扩展性

强烈不建议在本规范中使用厂商特定的专有扩展。作者不得使用此类扩展,因为这会降低互操作性并导致用户基数碎片化,只能让特定用户代理的用户访问相关内容。

如果必须使用厂商特定的扩展,成员应以厂商特定的字符串为前缀,以防止与本规范的未来版本冲突。扩展的定义必须保证使用扩展既不与本规范中定义的功能相矛盾,也不导致不符合规范的行为。

当需要对本规范进行厂商中立的扩展时,可以相应地更新本规范,或编写一份覆盖本规范要求的扩展规范。当有人在其活动中应用本规范并决定承认该扩展规范的要求时,它即成为本规范合规要求意义下的适用规范

2. 术语

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

3. 命名空间

HTML 命名空间为 https://w3org.cn/1999/xhtml

XML 命名空间为 https://w3org.cn/XML/1998/namespace

XMLNS 命名空间为 https://w3org.cn/2000/xmlns/

4. 解析与序列化 Nodes

4.1 解析

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

  1. 如果 context element节点文档HTML 文档:则令 algorithmHTML 片段解析算法

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

  2. new children 为调用 algorithm,以 markup,以 context element上下文元素后得到的结果。
  3. fragment 为一个新的DocumentFragment,其节点文档context element节点文档
  4. 追加每个在 new children 中的节点fragment(按树序)。

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

  5. 返回 fragment 的值。

4.2 序列化

以下步骤构成 片段序列化算法,其参数为一个 Node node 和标志 require well-formed

  1. context documentnode节点文档的值。
  2. 如果 context documentHTML 文档,则返回 nodeHTML 序列化
  3. 否则,context documentXML 文档;返回 nodeXML 序列化,并传入标志 require well-formed

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

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

要产生一个 nodeXML 序列化(给定标志 require well-formed),请执行以下步骤。

  1. context namespacenull。当 node 序列化其父节点的默认命名空间定义与自身不同的默认命名空间时,context namespace 会被更改。算法默认不使用任何命名空间。
  2. namespace prefix map 为一个新映射,用于关联 namespaceURI 与命名空间 prefix 的键值对,其中 namespaceURI 为映射的键,prefix 为键值。该 namespace prefix map 将通过先前出现的 namespaceURI 以及它们最近的前缀关联来填充子树。注意:该映射一次只能把单个前缀值关联到给定的 namespaceURI。在序列化期间,如果发现不同的前缀映射到相同的 namespaceURI,则后出现的前缀会“获胜”,用新前缀值替换映射中已有的键值。
  3. 使用 XML 命名空间 键并将字符串 "xml" 作为键值,初始化 namespace prefix map
  4. generated namespace prefix index 为整数 1。该索引用于在没有合适的现有命名空间前缀可用于序列化 nodenamespaceURI(或其属性的 namespaceURI)时生成一个唯一的新前缀值。参见生成前缀算法。
  5. 返回在 node 上运行XML 序列化算法的结果,传入 context namespacenamespace prefix mapgenerated namespace prefix index 引用以及标志 require well-formed。如果在执行算法期间出现异常,则捕获该异常并抛出一个名为 "InvalidStateError" 的 DOMException

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

否则,为生成XML 序列化而设的算法旨在产生与HTML 解析器兼容的序列化。例如,属于HTML 命名空间且没有子节点的元素,会使用显式的起始和结束标签,而不是自闭合标签语法[XML10]。

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

要在给定context namespace namespacenamespace prefix map prefix mapgenerated namespace prefix index prefix index以及标志 require well-formednode 运行XML 序列化算法,用户代理必须根据 node 的接口运行相应的步骤。

元素

运行以下算法:

  1. 如果 require well-formed 标志已设置(其值为 true),且此 nodelocalName属性包含字符 ":"(U+003A COLON)或不符合 XML Name 产生式[XML10],则抛出异常;该 node 的序列化将不是良构元素。
  2. markup 为字符串 "<"(U+003C 小于号)。
  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 为在 node 上记录命名空间信息(给定 mapelement prefixes listduplicate prefix definition)的结果。

    上述步骤会用已发现的命名空间前缀定义更新 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值。节点的前缀始终被省略。
    4. qualified name 的值追加到 markup
  13. 否则,inherited ns 不等于 ns(即节点自身的命名空间不同于父节点的上下文命名空间),执行以下子步骤:
    1. prefixnodeprefix属性的值。
    2. candidate prefixmap 中与 ns 匹配的键对应的值;若不存在匹配键,则令 candidate prefixnull
    3. 如果 candidate prefix 不为 null(存在映射到 ns 的合适前缀),则
      1. qualified namecandidate prefix、":"(U+003A COLON)以及 nodelocalName的拼接。在该节点或其祖先中存在定义该节点命名空间的前缀。
      2. 如果 local default namespace 不为 null(存在本地定义的默认命名空间声明属性),则令 inherited nsns 的值。
      3. qualified name 的值追加到 markup
    4. 否则,如果 prefix 不为 nulllocal default namespacenull,则
      1. 如果 element prefixes list 已包含 prefix 的值,则令 prefix生成前缀的结果,输入为 namespace prefix map mapnodens 字符串以及 prefix index 整数。
      2. 否则,将新的键 ns 及其键值 prefix 追加到 map 中。
      3. qualified nameprefix、":"(U+003A COLON)以及 nodelocalName的拼接。
      4. qualified name 的值追加到 markup
      5. 按以下顺序将下面内容追加到 markup以下序列化了刚刚在 map 中添加的新的命名空间/前缀关联。):
        1. " "(U+0020 空格);
        2. 字符串 "xmlns:";
        3. prefix 的值;
        4. "="(U+003D 等号、U+0022 引号);
        5. ns 进行属性值序列化的结果,传入 require well-formed 标志;
        6. "\""(U+0022 引号)。
    5. 否则,如果 local default namespacenull,或 local default namespace 不为 null 且其值不等于 ns,则
      1. ignore namespace definition attribute 标志设为 true
      2. qualified namenodelocalName值。
      3. inherited ns 的值为 ns新的默认命名空间将在序列化中用于定义该节点的命名空间,并作为其子节点的上下文命名空间。
      4. qualified name 的值追加到 markup
      5. 按以下顺序将下面内容追加到 markup以下序列化了新的(或替换的)默认命名空间定义。):
        1. " "(U+0020 空格);
        2. 字符串 "xmlns";
        3. "="(U+003D 等号、U+0022 引号);
        4. ns 进行属性值序列化的结果,传入 require well-formed 标志;
        5. "\""(U+0022 引号)。
    6. 否则,node 拥有与 ns 相匹配的本地默认命名空间。令 qualified namenodelocalName值,令 inherited ns 的值为 ns,并将 qualified name 的值追加到 markup
  14. XML 序列化的 node 属性 结果追加到 markup,传入 namespace prefix map mapgenerated prefix index prefix index、标志 ignore namespace definition attribute 与值 duplicate prefix definition
  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 空格);
    2. "/"(U+002F 斜杠)。
    并将 skip end tag 标志设为 true
  16. 如果 ns 不是HTML 命名空间,且 node子节点列表为空,则向 markup 追加 "/"(U+002F 斜杠),并将 skip end tag 标志设为 true
  17. markup 追加 ">"(U+003E 大于号)。
  18. 如果 skip end tag 的值为 true,则返回 markup 的值并跳过其余步骤。该 node 为叶子节点。
  19. 如果 nsHTML 命名空间,且 nodelocalName 为字符串 "template",则此节点为template 元素。向 markup 追加在XML 序列化算法上对该template 元素的template 内容DocumentFragment)的结果,提供 inherited ns 作为上下文命名空间map 作为命名空间前缀映射、prefix index 作为生成的前缀索引,并传入 require well-formed 标志。这使得 template 内容 能够往返序列化,符合XHTML 文档解析规则[HTML5]。
  20. 否则,向 markup 追加在XML 序列化算法上对每个 node子节点(按树序)的结果,提供 inherited ns 作为上下文命名空间map 作为命名空间前缀映射、prefix index 作为生成的前缀索引,并传入 require well-formed 标志。
  21. 按以下顺序将下面内容追加到 markup
    1. "</"(U+003C 小于号、U+002F 斜杠);
    2. qualified name 的值;
    3. ">"(U+003E 大于号)。
  22. 返回 markup 的值。
文档 (Document)

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

否则,运行以下步骤

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

如果 require well-formed 标志已设置(其值为 true),并且 nodedata 包含未匹配 XML Char 产生式 [XML10] 的字符,或包含 “--”(两个相邻的 U+002D HYPHEN-MINUS 字符),或以 “-”(U+002D HYPHEN-MINUS)结尾,则 throw an exception;此 nodedata 序列化将不是良构的。

返回 “<!--”、nodedata,以及 “-->” 的串联结果。

文本
  1. 如果 require well-formed 标志已设置(其值为 true),并且 nodedata 包含未匹配 XML Char 产生式 [XML10] 的字符,则 throw an exception;此 nodedata 序列化将不是良构的。
  2. markupnodedata 的值。
  3. markup 中出现的所有 “&” 替换为 “&amp;”。
  4. markup 中出现的所有 “<” 替换为 “&lt;”。
  5. markup 中出现的所有 “>” 替换为 “&gt;”。
  6. 返回 markup 的值。
DocumentFragment
  1. markup 为一个空字符串。
  2. node 的每个 child child,按 tree order,在给定 context namespace namespacenamespace prefix map prefix map、对 generated namespace prefix index 的引用 prefix index,以及标志 require well-formed,运行 XML serialization algorithmchild。将结果连接到 markup
  3. 返回 markup 的值。
文档类型
运行产生 node 的 DocumentType 序列化的步骤(给定 require well-formed 标志),并返回产生的字符串。
ProcessingInstruction
  1. 如果 require well-formed 标志已设置(其值为 true),并且 nodetarget 包含 “:”(U+003A COLON)字符,或与字符串 “xml”(ASCII 大小写不敏感)匹配,则 throw an exception;此 nodetarget 序列化将不是良构的。
  2. 如果 require well-formed 标志已设置(其值为 true),并且 nodedata 包含未匹配 XML Char 产生式 [XML10] 的字符,或包含字符串 “?>”(U+003F QUESTION MARK,U+003E GREATER-THAN SIGN),则 throw an exception;此 nodedata 序列化将不是良构的。
  3. markup 为以下内容的串联,按列出的顺序排列。
    1. <?”(U+003C LESS-THAN SIGN,U+003F QUESTION MARK);
    2. nodetarget 的值;
    3. " "(U+0020 空格);
    4. nodedata 的值;
    5. ?>”(U+003F QUESTION MARK,U+003E GREATER-THAN SIGN)。
  4. 返回 markup 的值。

produce a DocumentType serialization(产生 DocumentType 序列化)对于一个 Node node,给定 require well-formed 标志,用户代理必须返回以下算法的结果。

  1. 如果 require well-formed 标志为 true,且 nodepublicId 属性包含未匹配 XML PubidChar 产生式 [XML10] 的字符,则 throw an exception;此 node 的序列化将不是良构的文档类型声明。
  2. 如果 require well-formed 标志为 true,且 nodesystemId 属性包含未匹配 XML Char 产生式 [XML10] 的字符,或同时包含 “\"”(U+0022 QUOTATION MARK)和 “'”(U+0027 APOSTROPHE),则 throw an exception;此 node 的序列化将不是良构的文档类型声明。
  3. markup 为一个空字符串。
  4. 将字符串 “<!DOCTYPE” 追加到 markup
  5. 将 “ ”(U+0020 SPACE)追加到 markup
  6. nodename 属性值追加到 markup。对属于 HTML 文档node,该值全部为小写。
  7. 如果 nodepublicId 不是空字符串,则按列出的顺序将以下内容追加到 markup
    1. " "(U+0020 空格);
    2. 字符串 “PUBLIC”;
    3. " "(U+0020 空格);
    4. \"”(U+0022 QUOTATION MARK);
    5. nodepublicId 属性值;
    6. "\""(U+0022 引号)。
  8. 如果 nodesystemId 不是空字符串且 nodepublicId 为空字符串,则按列出的顺序将以下内容追加到 markup
    1. " "(U+0020 空格);
    2. 字符串 “SYSTEM”。
  9. 如果 nodesystemId 不是空字符串,则按列出的顺序将以下内容追加到 markup
    1. " "(U+0020 空格);
    2. \"”(U+0022 QUOTATION MARK);
    3. nodesystemId 属性值追加到 markup
    4. "\""(U+0022 引号)。
  10. markup 追加 ">"(U+003E 大于号)。
  11. 返回 markup 的值。

record the namespace information(记录命名空间信息)针对一个 Element element,给定 namespace prefix map map、一个最初为空的 element prefixes list,以及一个 duplicate prefix definition 引用,用户代理必须运行以下步骤。

  1. default namespace attr valuenull
  2. Main:对 elementattributes 中的每个 attribute attr,按照它们在 elementattribute list 中出现的顺序进行。

    以下条件步骤会将命名空间前缀加入 element prefixes list 并在 map 中添加或替换它们。仅考虑位于 XMLNS namespace 中的属性(例如,通过 setAttribute("xmlns:pretend-prefix", "pretend-namespace") 伪装的属性不计入)。

    1. attribute namespaceattrnamespaceURI 值。
    2. attribute prefixattrprefix 值。
    3. 如果 attribute namespaceXMLNS namespace,则
      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. 否则,map 中不存在与 namespace definition 匹配的键;向 map 追加一个新键 namespace definition,其键值为 prefix definition
        6. prefix definition 的值追加到 element prefixes list
  3. 返回 default namespace attr value 的值。

generate a prefix(生成前缀),给定 namespace prefix map map、一个字符串 new namespace,以及对 generated namespace prefix index prefix index 的引用,用户代理必须运行以下步骤。

  1. generated prefix 为字符串 “ns” 与当前 prefix index 数值的串联结果。
  2. prefix index 的值增加 1。
  3. map 追加一个新键 new namespace,其键值为 generated prefix
  4. 返回 generated prefix 的值。

XML serialization of the attributes(属性的 XML 序列化)针对一个 Element element,并结合 namespace prefix map mapgenerated prefix index prefix index、标志 ignore namespace definition attributeduplicate prefix definition 值以及标志 require well-formed,其结果为以下算法的返回值。

  1. result 为空字符串。
  2. localname set 为一个新的空 namespace localname set。此集合将包含唯一属性的 namespaceURIlocalName 元组,并在每处理一个 attr 时填入。该集合用于(可选地)强制实施良构约束:同一元素不能拥有两个具有相同 namespaceURIlocalName 的属性。这种情况会在同一元素的两个属性仅在前缀不同而其他全部相同的情况下出现。
  3. Main:对 elementattributes 中的每个 attribute attr,按照它们在 elementattribute list 中出现的顺序进行。
    1. 如果 require well-formed 标志已设置(其值为 true),且 localname set 已包含一个元组,其值与由 attrnamespaceURIlocalName 组成的新元组相匹配,则 throw an exception;此 attr 的序列化将导致元素序列化不符合良构。
    2. 创建一个新元组,由 attrnamespaceURIlocalName 组成,并将其加入 localname set
    3. attribute namespaceattrnamespaceURI 值。
    4. candidate prefixnull
    5. 如果 attribute namespace 不为 null,则运行以下子步骤。
      1. 如果 attribute namespace 的值是 XMLNS namespace,且(attrprefixnullignore namespace definition attribute 标志为 true)或者(attrprefix 不为 nullattrlocalNameduplicate prefix definition 的值相同),则停止运行这些步骤并转到 Main 处理下一个属性。
      2. 否则,如果 map 中存在一个键与 attribute namespace 的值相匹配,则令 candidate prefix 为该键在 map 中对应的值。
      3. 否则,map 中不存在与 attribute namespace 匹配的键,且 attribute namespace 也不是 XMLNS namespace。运行以下步骤。
        1. candidate prefixgenerating a prefix 的返回值,输入为 mapattribute namespaceprefix index
        2. 按列出的顺序将以下内容追加到 result
          1. " "(U+0020 空格);
          2. 字符串 "xmlns:";
          3. candidate prefix 的值;
          4. "="(U+003D 等号、U+0022 引号);
          5. attribute namespacerequire well-formed 标志作为输入,serializing an attribute value 的结果;
          6. "\""(U+0022 引号)。
    6. result 末尾追加一个 “ ”(U+0020 SPACE)。
    7. 如果 candidate prefix 不为 null,则在 result 末尾追加 candidate prefix 与 “:”(U+003A COLON)的串联。
    8. 如果 require well-formed 标志已设置(其值为 true),且此 attrlocalName 包含字符 “:”(U+003A COLON),或不匹配 XML Name 产生式 [XML10],或等于 “xmlns” 且 attribute namespacenull,则 throw an exception;此 attr 的序列化将不是良构属性。
    9. 按列出的顺序将以下字符串追加到 result
      1. attrlocalName 的值;
      2. "="(U+003D 等号、U+0022 引号);
      3. attrvaluerequire well-formed 标志作为输入,serializing an attribute value 的结果;
      4. "\""(U+0022 引号)。
  4. 返回 result 的值。

serialize an attribute value(序列化属性值),给定一个 attribute valuerequire well-formed 标志,用户代理必须运行以下步骤。

  1. 如果 require well-formed 标志已设置(其值为 true),且 attribute value 包含未匹配 XML Char 产生式 [XML10] 的字符,则 throw an exception;此 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 parser 解析 str,并返回新创建的 document

必须将 scripting flag 设为 “disabled”。

meta 元素不被用于决定所使用的编码,因为解析器接收的是 Unicode 流。

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

text/xml
application/xml
application/xhtml+xml
image/svg+xml
  1. 使用支持命名空间的 XML parser 解析 str

    对所有使用 XML parser 解析的 XHTML script 元素,等同于将 scripting flag 设为 “disabled”。

  2. 如果前一步没有返回错误,则返回新创建的 document
  3. document 为新创建的 XML Documentdocument 将使用 Document 接口,而非 XMLDocument 接口。
  4. root 为一个新的 Element,其 local name 为 “parsererror”,其 namespace 为 “http://www.mozilla.org/newlayout/xml/parsererror.xml”。

    此时用户代理可以 append 节点到 root,比如描述错误的性质。

  5. Append rootdocument
  6. 返回 document 的值。

无论如何,返回的 documentcontent type 必须等于 type 参数。此外,该 document 必须拥有一个 URL,其值等于 active document 的 URL,以及一个 locationnull 的值。

返回的 documentencoding 为默认的 UTF-8。

参数类型可为空 (Nullable)可选 (Optional)描述
strDOMString
typeSupportedType
Return type: Document

6. XMLSerializer 接口

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

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

6.1 方法

serializeToString
serializeToString(root) 方法必须 produce an XML serialization(产生 XML 序列化)root,并将 require well-formed 参数的值设为 false,随后返回结果。
参数类型可为空 (Nullable)可选 (Optional)描述
rootNode
Return type: 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,则抛出 DOMException,其 name 为 “InvalidStateError”;如果给定的字符串不是良构的,则抛出 DOMException,其 name 为 “SyntaxError”。

在获取时,返回对 fragment serializing algorithm(片段序列化算法)的调用结果,提供 truerequire well-formed 标志(这可能抛出异常而非返回字符串)。

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

  1. fragment 为调用 fragment parsing algorithm(片段解析算法)得到的结果,使用新值作为 markup,并以 context object 作为 context element
  2. Replace all fragmentcontext object 中。
outerHTML,类型为 DOMString

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

element . outerHTML [ = value ]

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

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

XML 文档 的情况下,如果元素无法序列化为 XML,则抛出 DOMException,其 name 为 “InvalidStateError”;如果给定字符串不是良构的,则抛出 DOMException,其 name 为 “SyntaxError”。

如果元素的父节点是 Document 节点,则抛出 DOMException,其 name 为 “NoModificationAllowedError”。

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

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

  1. parent上下文对象父节点
  2. 如果 parent 为 null,则终止这些步骤。即使继续执行剩余步骤,也无法获得已创建节点的引用。
  3. 如果 parent 是一个 Document,则抛出一个名称为“NoModificationAllowedError”的 DOMException 异常。
  4. 如果 parent 是一个 DocumentFragment,则令 parent 为一个新的 Element,其
  5. fragment 为调用片段解析算法的结果,使用新值作为markup,并将 parent 作为上下文元素
  6. Replace 上下文对象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 作为上下文元素
  4. 使用本列表中的第一个匹配项
    如果 position 与字符串 "beforebegin" ASCII 不区分大小写 匹配
    Insert fragment上下文对象父节点,在 上下文对象 之前。
    如果 position 与字符串 "afterbegin" ASCII 不区分大小写 匹配
    Insert fragment上下文对象,位于其第一个子节点之前。
    如果 position 与字符串 "beforeend" ASCII 不区分大小写 匹配
    Append fragment上下文对象
    如果 position 与字符串 "afterend" ASCII 不区分大小写 匹配
    Insert fragment上下文对象父节点,在 上下文对象下一个兄弟节点之前。
参数类型可为空 (Nullable)可选 (Optional)描述
positionDOMString
textDOMString
返回类型: 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
    元素
    node (节点)
    文本
    Comment
    node父元素
    文档类型
    ProcessingInstruction
    [DOM4] 防止此情况。
  2. 如果 element 为 null,或以下全部为真

    element 为一个新的element,其

  3. fragment node 为调用片段解析算法的结果,使用 fragment 作为 markup,并将 element 作为上下文元素
  4. fragment node 中的所有脚本标记为“已启动”。
  5. 返回 fragment node 的值。
参数类型可为空 (Nullable)可选 (Optional)描述
fragmentDOMString
返回类型: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: https://w3org.cn/TR/html5/
[RFC2119]
S. Bradner. IETF. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳当前实践. URL: https://tools.ietf.org/html/rfc2119
[WEBIDL]
Cameron McCormack; Boris Zbarsky. W3C. WebIDL Level 1. 2016年3月8日. W3C 候选推荐稿. URL: https://w3org.cn/TR/WebIDL-1/

C.2 信息性参考文献

[DOM4]
Anne van Kesteren; Aryeh Gregor; Ms2ger; Alex Russell; Robin Berjon. W3C. W3C DOM4. 2015年11月19日. W3C 推荐稿. URL: https://w3org.cn/TR/dom/
[XML10]
Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau 等. W3C. Extensible Markup Language (XML) 1.0 (Fifth Edition). 2008年11月26日. W3C 推荐稿. URL: https://w3org.cn/TR/xml