版权 © 2016 W3C®(MIT、ERCIM、庆应、北航)。W3C 责任声明、商标以及宽松文档许可证规则适用。
本规范定义了多种 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 日满足此标准。工作组还将创建实现报告。
除了标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
在算法中使用的祈使句(例如“去除任何前导空格字符”或“返回 false 并终止这些步骤”)应依据引入该算法时使用的关键字(“必须”、“应当”、“可以”等)来解释其含义。
以算法或具体步骤表述的一致性要求可以以任何方式实现,只要最终结果等效即可。(特别说明,本规范中定义的算法旨在易于遵循,而非旨在达到高性能。)
用户代理可能会对本来无限制的输入施加实现特定的限制,例如防止拒绝服务攻击、避免内存耗尽,或规避平台特有的限制。
当说某个方法或属性调用另一个方法或属性时,用户代理必须调用该属性或方法的内部 API,以防止作者通过在 ECMAScript 中用自定义属性或函数覆盖属性或方法来改变行为。
除非另有说明,字符串比较均采用区分大小写的方式进行。
如果一个算法调用另一个算法,而后者抛出异常(除非被显式捕获),则必须导致前者终止,并将该异常向上抛至其调用者。
本规范中的 IDL 片段必须按照 Web IDL 规范中对符合要求的 IDL 片段的解释进行解释。[WEBIDL]
强烈不建议在本规范中使用厂商特定的专有扩展。作者不得使用此类扩展,因为这会降低互操作性并导致用户基数碎片化,只能让特定用户代理的用户访问相关内容。
如果必须使用厂商特定的扩展,成员应以厂商特定的字符串为前缀,以防止与本规范的未来版本冲突。扩展的定义必须保证使用扩展既不与本规范中定义的功能相矛盾,也不导致不符合规范的行为。
当需要对本规范进行厂商中立的扩展时,可以相应地更新本规范,或编写一份覆盖本规范要求的扩展规范。当有人在其活动中应用本规范并决定承认该扩展规范的要求时,它即成为本规范合规要求意义下的适用规范。
术语 上下文对象 指调用所讨论的方法或属性的对象。
HTML 命名空间为 https://w3org.cn/1999/xhtml。
XML 命名空间为 https://w3org.cn/XML/1998/namespace。
XMLNS 命名空间为 https://w3org.cn/2000/xmlns/。
以下步骤构成 片段解析算法,其参数为一个 markup 字符串和一个 context element。
如果 context element 的节点文档是HTML 文档:则令 algorithm 为HTML 片段解析算法。
如果 context element 的节点文档是XML 文档:则令 algorithm 为XML 片段解析算法。
DocumentFragment,其节点文档为 context element 的节点文档。这确保了新节点的节点文档是正确的。
以下步骤构成 片段序列化算法,其参数为一个 Node node 和标志 require well-formed。
本文件定义的XML 序列化符合[HTML5]中XML 片段序列化算法的要求。
要产生一个 node 的HTML 序列化,用户代理必须运行HTML 片段序列化算法 [HTML5],并返回产生的字符串。
要产生一个 node 的XML 序列化(给定标志 require well-formed),请执行以下步骤。
null。当 node 序列化其父节点的默认命名空间定义与自身不同的默认命名空间时,context namespace 会被更改。算法默认不使用任何命名空间。namespaceURI 与命名空间 prefix 的键值对,其中 namespaceURI 为映射的键,prefix 为键值。该 namespace prefix map 将通过先前出现的 namespaceURI 以及它们最近的前缀关联来填充子树。注意:该映射一次只能把单个前缀值关联到给定的 namespaceURI。在序列化期间,如果发现不同的前缀映射到相同的 namespaceURI,则后出现的前缀会“获胜”,用新前缀值替换映射中已有的键值。xml" 作为键值,初始化 namespace prefix map。1。该索引用于在没有合适的现有命名空间前缀可用于序列化 node 的 namespaceURI(或其属性的 namespaceURI)时生成一个唯一的新前缀值。参见生成前缀算法。InvalidStateError" 的 DOMException。XML 序列化在以下方面不同于 HTML 序列化:
namespaceURI。在某些情况下,这意味着现有的前缀、前缀声明属性或默认命名空间声明属性可能会被删除、替换或更改。而HTML 序列化并不尝试保留 namespaceURI。EmptyElemTag 的产生式)。否则,为生成XML 序列化而设的算法旨在产生与HTML 解析器兼容的序列化。例如,属于HTML 命名空间且没有子节点的元素,会使用显式的起始和结束标签,而不是自闭合标签语法[XML10]。
要在给定context namespace namespace、namespace prefix map prefix map、generated namespace prefix index prefix index以及标志 require well-formed 对 node 运行XML 序列化算法,用户代理必须根据 node 的接口运行相应的步骤。
元素
运行以下算法:
true),且此 node 的localName属性包含字符 ":"(U+003A COLON)或不符合 XML Name 产生式[XML10],则抛出异常;该 node 的序列化将不是良构元素。<"(U+003C 小于号)。false。false。null。上述步骤会用已发现的命名空间前缀定义更新 map,将发现的前缀定义添加到 element prefixes list,必要时设置 duplicate prefix definition 的值,并在存在默认命名空间属性时返回该属性定义的本地默认命名空间值;否则返回 null。
namespaceURI属性的值。prefix属性的值。null。
null(存在映射到 ns 的合适前缀),则:"(U+003A COLON)以及 node 的localName的拼接。在该节点或其祖先中存在定义该节点命名空间的前缀。null(存在本地定义的默认命名空间声明属性),则令 inherited ns 取 ns 的值。null 且 local default namespace 为 null,则:"(U+003A COLON)以及 node 的localName的拼接。 "(U+0020 空格);xmlns:";="(U+003D 等号、U+0022 引号);\""(U+0022 引号)。null,或 local default namespace 不为 null 且其值不等于 ns,则true。localName值。 "(U+0020 空格);xmlns";="(U+003D 等号、U+0022 引号);\""(U+0022 引号)。localName值,令 inherited ns 的值为 ns,并将 qualified name 的值追加到 markup。localName匹配以下任意空标签元素之一:"area"、"base"、"basefont"、"bgsound"、"br"、"col"、"embed"、"frame"、"hr"、"img"、"input"、"keygen"、"link"、"menuitem"、"meta"、"param"、"source"、"track"、"wbr",则按以下顺序将下面内容追加到 markup: "(U+0020 空格);/"(U+002F 斜杠)。true。/"(U+002F 斜杠),并将 skip end tag 标志设为 true。>"(U+003E 大于号)。true,则返回 markup 的值并跳过其余步骤。该 node 为叶子节点。localName 为字符串 "template",则此节点为template 元素。向 markup 追加在XML 序列化算法上对该template 元素的template 内容(DocumentFragment)的结果,提供 inherited ns 作为上下文命名空间、map 作为命名空间前缀映射、prefix index 作为生成的前缀索引,并传入 require well-formed 标志。这使得 template 内容 能够往返序列化,符合XHTML 文档解析规则[HTML5]。</"(U+003C 小于号、U+002F 斜杠);>"(U+003E 大于号)。文档 (Document)
如果 require well-formed 标志已设置(其值为 true),且此 node 没有documentElement(即该属性值为 null),则抛出异常;该 node 的序列化将不是良构文档。
否则,运行以下步骤
doctype 属性不为 null,则向 serialized document 追加使用生成 DocumentType 序列化步骤产生的字符串,前提是依据 require well-formed 标志。Comment
如果 require well-formed 标志已设置(其值为 true),并且 node 的 data 包含未匹配 XML Char 产生式 [XML10] 的字符,或包含 “--”(两个相邻的 U+002D HYPHEN-MINUS 字符),或以 “-”(U+002D HYPHEN-MINUS)结尾,则 throw an exception;此 node 的 data 序列化将不是良构的。
返回 “<!--”、node 的 data,以及 “-->” 的串联结果。
文本
true),并且 node 的 data 包含未匹配 XML Char 产生式 [XML10] 的字符,则 throw an exception;此 node 的 data 序列化将不是良构的。data 的值。&” 替换为 “&”。<” 替换为 “<”。>” 替换为 “>”。DocumentFragment
文档类型
ProcessingInstruction
true),并且 node 的 target 包含 “:”(U+003A COLON)字符,或与字符串 “xml”(ASCII 大小写不敏感)匹配,则 throw an exception;此 node 的 target 序列化将不是良构的。true),并且 node 的 data 包含未匹配 XML Char 产生式 [XML10] 的字符,或包含字符串 “?>”(U+003F QUESTION MARK,U+003E GREATER-THAN SIGN),则 throw an exception;此 node 的 data 序列化将不是良构的。要 produce a DocumentType serialization(产生 DocumentType 序列化)对于一个 Node node,给定 require well-formed 标志,用户代理必须返回以下算法的结果。
true,且 node 的 publicId 属性包含未匹配 XML PubidChar 产生式 [XML10] 的字符,则 throw an exception;此 node 的序列化将不是良构的文档类型声明。true,且 node 的 systemId 属性包含未匹配 XML Char 产生式 [XML10] 的字符,或同时包含 “\"”(U+0022 QUOTATION MARK)和 “'”(U+0027 APOSTROPHE),则 throw an exception;此 node 的序列化将不是良构的文档类型声明。<!DOCTYPE” 追加到 markup。 ”(U+0020 SPACE)追加到 markup。name 属性值追加到 markup。对属于 HTML 文档 的 node,该值全部为小写。publicId 不是空字符串,则按列出的顺序将以下内容追加到 markup。 "(U+0020 空格);PUBLIC”; "(U+0020 空格);\"”(U+0022 QUOTATION MARK);publicId 属性值;\""(U+0022 引号)。systemId 不是空字符串且 node 的 publicId 为空字符串,则按列出的顺序将以下内容追加到 markup。 "(U+0020 空格);SYSTEM”。systemId 不是空字符串,则按列出的顺序将以下内容追加到 markup。 "(U+0020 空格);\"”(U+0022 QUOTATION MARK);systemId 属性值追加到 markup;\""(U+0022 引号)。>"(U+003E 大于号)。要 record the namespace information(记录命名空间信息)针对一个 Element element,给定 namespace prefix map map、一个最初为空的 element prefixes list,以及一个 duplicate prefix definition 引用,用户代理必须运行以下步骤。
null。attributes 中的每个 attribute attr,按照它们在 element 的 attribute list 中出现的顺序进行。以下条件步骤会将命名空间前缀加入 element prefixes list 并在 map 中添加或替换它们。仅考虑位于 XMLNS namespace 中的属性(例如,通过 setAttribute("xmlns:pretend-prefix", "pretend-namespace") 伪装的属性不计入)。
namespaceURI 值。prefix 值。null,则 attr 为默认命名空间声明。将 default namespace attr value 设置为 attr 的 value,并停止执行这些步骤,返回 Main 以访问下一个属性。null,且 attr 为命名空间前缀定义。运行以下步骤。localName 值。value 值。要 generate a prefix(生成前缀),给定 namespace prefix map map、一个字符串 new namespace,以及对 generated namespace prefix index prefix index 的引用,用户代理必须运行以下步骤。
ns” 与当前 prefix index 数值的串联结果。XML serialization of the attributes(属性的 XML 序列化)针对一个 Element element,并结合 namespace prefix map map、generated prefix index prefix index、标志 ignore namespace definition attribute、duplicate prefix definition 值以及标志 require well-formed,其结果为以下算法的返回值。
namespaceURI 与 localName 元组,并在每处理一个 attr 时填入。该集合用于(可选地)强制实施良构约束:同一元素不能拥有两个具有相同 namespaceURI 与 localName 的属性。这种情况会在同一元素的两个属性仅在前缀不同而其他全部相同的情况下出现。attributes 中的每个 attribute attr,按照它们在 element 的 attribute list 中出现的顺序进行。true),且 localname set 已包含一个元组,其值与由 attr 的 namespaceURI 与 localName 组成的新元组相匹配,则 throw an exception;此 attr 的序列化将导致元素序列化不符合良构。namespaceURI 与 localName 组成,并将其加入 localname set。namespaceURI 值。
null。null,则运行以下子步骤。prefix 为 null 且 ignore namespace definition attribute 标志为 true)或者(attr 的 prefix 不为 null 且 attr 的 localName 与 duplicate prefix definition 的值相同),则停止运行这些步骤并转到 Main 处理下一个属性。 "(U+0020 空格);xmlns:";="(U+003D 等号、U+0022 引号);\""(U+0022 引号)。 ”(U+0020 SPACE)。null,则在 result 末尾追加 candidate prefix 与 “:”(U+003A COLON)的串联。
true),且此 attr 的 localName 包含字符 “:”(U+003A COLON),或不匹配 XML Name 产生式 [XML10],或等于 “xmlns” 且 attribute namespace 为 null,则 throw an exception;此 attr 的序列化将不是良构属性。
localName 的值;="(U+003D 等号、U+0022 引号);value 与 require well-formed 标志作为输入,serializing an attribute value 的结果;\""(U+0022 引号)。要 serialize an attribute value(序列化属性值),给定一个 attribute value 与 require well-formed 标志,用户代理必须运行以下步骤。
true),且 attribute value 包含未匹配 XML Char 产生式 [XML10] 的字符,则 throw an exception;此 attribute value 的序列化将导致元素序列化不符合良构。null,则返回空字符串。\"” 替换为 “"”;&” 替换为 “&”;<” 替换为 “<”;>” 替换为 “>”。这与浏览器的实际行为一致,并且超出了 XML 规范中 AttValue 产生式的语法要求 [XML10],因为它还替换了 “>”。
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);
};parseFromStringparseFromString(str, type) 方法必须依据 type 运行以下步骤。
text/html”使用 HTML parser 解析 str,并返回新创建的 document。
必须将 scripting flag 设为 “disabled”。
meta 元素不被用于决定所使用的编码,因为解析器接收的是 Unicode 流。
text/xml”application/xml”application/xhtml+xml”image/svg+xml”XML parser 解析 str。对所有使用 XML parser 解析的 XHTML script 元素,等同于将 scripting flag 设为 “disabled”。
Document 接口,而非 XMLDocument 接口。令 root 为一个新的 Element,其 local name 为 “parsererror”,其 namespace 为 “http://www.mozilla.org/newlayout/xml/parsererror.xml”。
此时用户代理可以 append 节点到 root,比如描述错误的性质。
无论如何,返回的 document 的 content type 必须等于 type 参数。此外,该 document 必须拥有一个 URL,其值等于 active document 的 URL,以及一个 location 为 null 的值。
| 参数 | 类型 | 可为空 (Nullable) | 可选 (Optional) | 描述 |
|---|---|---|---|---|
| str | DOMString | ✘ | ✘ | |
| type | SupportedType | ✘ | ✘ |
DocumentXMLSerializer 接口XMLSerializer() 构造函数必须返回一个新的 XMLSerializer 对象。
[Constructor]
interface XMLSerializer {
DOMString serializeToString (Node root);
};serializeToStringserializeToString(root) 方法必须 produce an XML serialization(产生 XML 序列化)root,并将 require well-formed 参数的值设为 false,随后返回结果。| 参数 | 类型 | 可为空 (Nullable) | 可选 (Optional) | 描述 |
|---|---|---|---|---|
| root | Node | ✘ | ✘ |
DOMStringElement 接口的扩展partial interface Element {
[CEReactions, TreatNullAs=EmptyString]
attribute DOMString innerHTML;
[CEReactions, TreatNullAs=EmptyString]
attribute DOMString outerHTML;
[CEReactions]
void insertAdjacentHTML (DOMString position, DOMString text);
};innerHTML,类型为 DOMStringinnerHTML IDL 属性表示 Element 内容的标记。
innerHTML [ = value ]返回一个表示元素内容的 HTML 或 XML 片段。
可以设置,以使用给定字符串解析得到的节点替换元素的内容。
在 XML 文档 的情况下,如果 Element 无法序列化为 XML,则抛出 DOMException,其 name 为 “InvalidStateError”;如果给定的字符串不是良构的,则抛出 DOMException,其 name 为 “SyntaxError”。
在获取时,返回对 fragment serializing algorithm(片段序列化算法)的调用结果,提供 true 给 require well-formed 标志(这可能抛出异常而非返回字符串)。
在设置时,必须运行以下步骤。
outerHTML,类型为 DOMStringouterHTML IDL 属性表示 Element 本身及其内容的标记。
outerHTML [ = value ]返回一个表示元素本身及其内容的 HTML 或 XML 片段。
可以设置,以使用给定字符串解析得到的节点替换该元素。
在 XML 文档 的情况下,如果元素无法序列化为 XML,则抛出 DOMException,其 name 为 “InvalidStateError”;如果给定字符串不是良构的,则抛出 DOMException,其 name 为 “SyntaxError”。
如果元素的父节点是 Document 节点,则抛出 DOMException,其 name 为 “NoModificationAllowedError”。
获取时,返回对一个虚构节点(其唯一子节点为上下文对象,且该对象为require well-formed标志提供true)调用片段序列化算法的结果(这可能抛出异常而不是返回字符串)。
设置时,必须运行以下步骤
Document,则抛出一个名称为“NoModificationAllowedError”的 DOMException 异常。DocumentFragment,则令 parent 为一个新的 Element,其
insertAdjacentHTMLinsertAdjacentHTML(position, text)将给定的字符串 text 解析为 HTML 或 XML,并根据 position 参数指定的位置,将生成的节点插入到树中,如下所示
如果参数值无效(例如,对于XML 文档,如果给定的字符串不是良构的),则抛出一个名称为“SyntaxError”的 DOMException。
如果给定的位置不可行(例如,在 Document 的根元素之后插入元素),则抛出一个名称为“NoModificationAllowedError”的 DOMException。
必须按以下步骤执行 insertAdjacentHTML(position, text) 方法
如果 context 为 null 或一个文档,则抛出一个名称为“NoModificationAllowedError”的 DOMException。
抛出一个名称为“SyntaxError”的 DOMException。
Element,或以下条件全部成立
令 context 为一个新的Element,其
| 参数 | 类型 | 可为空 (Nullable) | 可选 (Optional) | 描述 |
|---|---|---|---|---|
| position | DOMString | ✘ | ✘ | |
| text | DOMString | ✘ | ✘ |
voidRange 接口的扩展partial interface Range {
[CEReactions, NewObject]
DocumentFragment createContextualFragment (DOMString fragment);
};createContextualFragmentcreateContextualFragment(markupString)DocumentFragment。必须按以下步骤执行 createContextualFragment(fragment) 方法
根据 node 的接口,令 element 如下
文档 (Document)
DocumentFragment
元素
文本
Comment
文档类型
ProcessingInstruction
令 element 为一个新的element,其
| 参数 | 类型 | 可为空 (Nullable) | 可选 (Optional) | 描述 |
|---|---|---|---|---|
| fragment | DOMString | ✘ | ✘ |
DocumentFragment以下是自上次发布本规范以来的变更信息性摘要。该规范编辑稿的完整修订历史可在此处找到。
感谢 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() 方法,并提供了有价值的评论。