Copyright © 2016 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本规范定义了各种 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 日 满足此准则。该组还将创建一份 实现报告。
除了标记为非规范性的章节外,本规范中的所有创作指南、图示、示例 和注释均为非规范性。本规范中的其他所有内容都是 规范性的。
作为算法一部分以祈使语气表述的要求 (例如“strip any leading space characters”或“return false and terminate these steps”)应根据引入该 算法时所使用的关键词(“must”、“should”、“may”等)的含义来解释。
以算法或具体步骤表述的一致性要求 可以用任何方式实现,只要最终结果是 等价的。(特别是,本 规范中定义的算法旨在易于理解,而非旨在 具备高性能。)
用户代理可以对原本不受约束的输入 施加实现特定的限制, 例如为了防止拒绝服务攻击、防止耗尽 内存,或绕过平台特定的限制。
当某个方法或属性被称为调用另一个方法或 属性时,用户代理必须调用其用于该 属性或方法的内部 API,以便例如作者不能通过在 ECMAScript 中 用自定义属性或函数覆盖属性或方法来改变其行为。
除非另有说明,字符串比较均以 区分大小写的方式进行。
如果某个算法调用另一个算法,后者抛出的任何异常 (除非被显式捕获)都必须导致前者 终止,并将该异常传播给 其调用者。
本规范中的 IDL 片段必须按照 Web IDL 规范中所描述的符合要求的 IDL 片段来解释。 [WEBIDL]
强烈不鼓励对本规范进行供应商特定的专有扩展。 作者不得使用此类扩展,因为 这样做会降低互操作性并割裂用户群, 使只有特定用户代理的用户才能访问相关内容。
如果需要供应商特定的扩展,则成员应以 供应商特定的字符串作为前缀,以防与本规范的未来 版本发生冲突。扩展的定义必须确保 扩展的使用既不会与规范中定义的功能相矛盾, 也不会导致这些功能 不符合规范。
当需要对本规范进行供应商中立的扩展时, 可以相应更新本规范,或者可以编写 一个扩展规范来覆盖本规范中的 要求。当某个将本 规范应用于其活动的人决定承认 这种扩展规范的要求时,它就成为本 规范中一致性要求目的下的 适用 规范。
术语 上下文对象表示被讨论的 方法或 属性所调用的对象。
HTML 命名空间是
http://www.w3.org/1999/xhtml。
XML 命名空间是
http://www.w3.org/XML/1998/namespace。
XMLNS 命名空间是
http://www.w3.org/2000/xmlns/。
以下步骤构成 片段 解析算法,其 参数是一个 markup 字符串和一个 context element:
如果 context element 的 节点文档 是一个 HTML 文档:令 algorithm 为 HTML 片段解析算法。
如果 context element 的 节点文档 是一个 XML 文档:令 algorithm 为 XML 片段解析算法。
DocumentFragment,
其
节点文档
是 context element 的
节点文档。
以下步骤构成
片段序列化算法,
其参数是一个
Node
node 和一个标志 要求格式良好:
本文档中定义的 XML 序列化 符合 [HTML5] 中定义的 XML 片段 序列化算法的要求。
要产生一个
Node
node 的 HTML 序列化,用户代理
必须在 node 上运行
HTML
片段序列化算法 [HTML5],
并返回所产生的字符串。
要在给定标志 require well-formed 的情况下,产生一个
Node
node 的 XML
序列化,
运行以下步骤:
null。
当一个
node 序列化出不同于其父级的默认命名空间定义时,上下文命名空间会发生改变。该
算法假定起始时没有命名空间。
namespaceURI 与命名空间 prefix 对,其中
namespaceURI 值是映射的键,prefix 值是
映射的键值。该命名空间前缀
映射
将由此前见过的 namespaceURI 及其在子树中最近的前缀关联填充。
注:
命名空间前缀映射只会把单个
前缀值与给定的 namespaceURI 关联起来。在序列化期间,如果发现不同命名空间前缀
映射到同一 namespaceURI,则最后遇到的那个会通过用新的前缀值替换映射中
现有键值的方式“胜出”。
xml" 作为键值来初始化命名空间前缀映射。
1 的整数。当没有合适的现有
命名空间前缀可用于序列化 node 的 namespaceURI(或
node 的某个属性的 namespaceURI)时,生成的命名空间
前缀索引用于生成一个新的唯一前缀值。参见
生成前缀算法。
InvalidStateError"
的
DOMException。
EmptyElemTag
产生式)。
除此之外,用于产生 XML 序列化的算法 被设计为产生与 HTML 解析器兼容的序列化。例如, HTML 命名空间中不包含子节点的元素会被序列化为 显式的开始标签和结束标签,而不是使用自闭合标签语法 [XML10]。
要在给定上下文命名空间 namespace、命名空间前缀 映射 prefix map、生成的命名空间前缀 索引 prefix index,以及标志 require well-formed 的情况下,在 node 上运行 XML 序列化算法,用户代理必须根据 node 的接口运行相应步骤:
Element
运行以下算法:
true),且此 node 的
localName
属性包含字符 ":"(U+003A COLON),或不匹配
XML Name 产生式 [XML10],则抛出
异常;此 node 的序列化将不是格式良好的
元素。
<"(U+003C LESS-THAN SIGN)。
false。
false。
null。
上述步骤会用任何找到的命名空间
前缀
定义更新 map,将找到的前缀定义添加到 element prefixes
list,可选地
设置 duplicate prefix definition 值,并返回由默认命名空间属性定义的局部默认
命名空间
值(如果存在)。否则它返回
null。
namespaceURI
属性的值。
prefix
属性的值。
null。
null(已定义一个映射到
ns 的合适命名空间前缀),则:
:"(U+003A COLON)以及 node 的
localName
的连接。
在此 node 或该
node 的祖先上存在一个
命名空间前缀定义,该定义定义了 node 的
命名空间。
null(存在
一个局部定义的
默认命名空间声明属性),则令 inherited ns
取得
ns 的值。
null 且 local default
namespace 为
null,则:
:"(U+003A COLON)以及 node 的
localName
的连接。
"(U+0020 SPACE);
xmlns:";
=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
""(U+0022 QUOTATION MARK)。
null,或
local
default namespace 不为 null 且其值不等于
ns,则:
true。
localName
的值。
"(U+0020 SPACE);
xmlns";
=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
""(U+0022 QUOTATION MARK)。
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 SPACE);
/"(U+002F SOLIDUS)。
true。
/"(U+002F SOLIDUS)追加到 markup,
并将 skip end tag 标志设为 true。
>"(U+003E GREATER-THAN SIGN)追加到 markup。
true,则返回
markup 的值,并跳过剩余步骤。该
node 是一个叶节点。
localName
匹配字符串 "template",则这是一个
template
元素。
将在
template 元素的
template 内容
(一个
DocumentFragment)
上运行
XML 序列化算法的结果
追加到 markup,
并为
上下文命名空间提供
inherited ns 的值,
为命名空间
前缀映射提供 map,
为
生成的命名空间前缀索引提供
prefix index,并提供 require well-formed 标志的值。
在给定
解析 XHTML 文档
规则的情况下,这允许
template 内容往返
[HTML5]。
</"(U+003C LESS-THAN SIGN, U+002F SOLIDUS);
>"(U+003E GREATER-THAN SIGN)。
Document
如果require well-formed 标志已设置(其值为
true),且此 node 没有
documentElement
(
documentElement
属性的值为 null),则抛出
异常;此 node 的序列化将不是格式良好的
文档。
否则,运行以下步骤:
doctype
属性不为 null,则在提供 require well-formed 标志的情况下,
将为 node 的
doctype
属性产生 DocumentType 序列化的步骤
所产生的字符串追加到 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
DocumentFragment
DocumentType
ProcessingInstruction
true),且 node 的
target
包含一个 ":"(U+003A COLON)字符,或与字符串 "xml" 进行
ASCII 不区分大小写
匹配,则抛出
异常;此 node 的
target
的序列化将不是格式良好的。
true),且 node 的
data
包含不匹配 XML Char 产生式的字符 [XML10],或
包含字符串 "?>"(U+003F QUESTION MARK, U+003E GREATER-THAN SIGN),
则抛出异常;此
node 的
data
的序列化将不是格式良好的。
要在给定
require well-formed 标志的情况下,为一个
Node
node 产生 DocumentType 序列化,
用户代理必须返回以下算法的结果:
true,
且 node 的
publicId
属性包含不匹配 XML PubidChar 产生式的字符
[XML10],则抛出异常;此 node
的序列化将不是格式良好的文档类型声明。
true,
且 node 的
systemId
属性包含不匹配 XML Char 产生式的字符
[XML10],或同时包含
"""(U+0022 QUOTATION MARK)和 "'"
(U+0027 APOSTROPHE),则抛出
异常;此
node 的序列化将不是格式良好的文档类型声明。
<!DOCTYPE" 追加到 markup。
"(U+0020 SPACE)追加到 markup。
name
属性的值追加到 markup。对于属于
HTML
文档的 node,
该值将全为小写。
publicId
不是空字符串,则按所列顺序将以下内容追加到 markup:
"(U+0020 SPACE);
PUBLIC";
"(U+0020 SPACE);
""(U+0022 QUOTATION MARK);
publicId
属性的值;
""(U+0022 QUOTATION MARK)。
systemId
不是空字符串,且 node 的
publicId
被设为空字符串,则按所列顺序将以下内容追加到 markup:
"(U+0020 SPACE);
SYSTEM"。
systemId
不是空字符串,则按所列顺序将以下内容追加到 markup:
"(U+0020 SPACE);
""(U+0022 QUOTATION MARK);
systemId
属性的值;
""(U+0022 QUOTATION MARK)。
>"(U+003E GREATER-THAN SIGN)追加到 markup。
要在给定
命名空间前缀映射 map、一个
element prefixes list(初始为空)以及一个 duplicate prefix
definition 引用的情况下,为一个
Element
element 记录命名空间信息,
用户代理必须运行以下步骤:
null。
attributes
中的每个属性
attr,
按其在 element 的
属性列表中指定的顺序:
以下条件步骤会将命名空间前缀
添加到 element prefixes list 中,并在 map 中添加或替换它们。
只考虑 XMLNS
命名空间中的属性
(例如,通过
setAttribute("xmlns:pretend-prefix",
"pretend-namespace") 制作得看起来像命名空间声明的属性不会被包括在内)。
namespaceURI
值。
prefix
的值。
null,则 attr 是
一个默认命名空间声明。将 default namespace attr value 设为
attr 的
value,
并停止运行这些步骤,返回到
Main 以访问下一个属性。
null,且
attr
是一个命名空间前缀定义。运行以下步骤:
localName
的值。
value
的值。
要在给定 命名空间前缀映射 map、一个 字符串 new namespace,以及对 生成的命名空间前缀索引 prefix index 的引用的情况下,生成 前缀,用户代理必须运行以下步骤:
ns" 与
prefix index 的当前数值的连接。
一个
Element
element 的
属性的 XML 序列化,
连同一个命名空间前缀
映射 map、一个生成的前缀索引
prefix index 引用、一个标志 ignore namespace definition attribute、一个
duplicate prefix definition 值,以及一个标志 require well-formed,
是以下算法的结果:
namespaceURI
和
localName
对的元组,并在处理每个 attr 时被填充。
此集合用于[可选地]强制执行格式良好约束,即
一个元素不能有两个具有相同
namespaceURI
和
localName
的属性。
当同一元素上的两个本来相同的属性仅前缀值不同时,可能发生这种情况。
attributes
中的每个属性
attr,
按其在 element 的
属性列表中指定的顺序:
true),且 localname set 包含一个元组,其值匹配
一个由 attr 的
namespaceURI
属性和
localName
属性组成的新元组的值,则抛出
异常;此
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 SPACE);
xmlns:";
=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
""(U+0022 QUOTATION MARK)。
"(U+0020 SPACE)追加到 result。
null,则将
candidate prefix 与 ":"(U+003A COLON)的连接追加到
result。
true),且此 attr 的
localName
属性包含字符 ":"(U+003A COLON),或不匹配 XML
Name 产生式 [XML10],或
等于 "xmlns" 且 attribute
namespace 为 null,则抛出
异常;此 attr 的序列化将不是格式良好的
属性。
localName
的值;
=""(U+003D EQUALS SIGN, U+0022 QUOTATION MARK);
value
属性和require
well-formed 标志作为输入,序列化属性值的结果;
""(U+0022 QUOTATION MARK)。
要在给定一个 attribute value 和require well-formed 标志的情况下, 序列化属性值, 用户代理必须运行以下步骤:
true),且 attribute value 包含不匹配
XML Char 产生式的字符 [XML10],则
抛出异常;此
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);
};
parseFromString
parseFromString(str, type)
方法必须根据 type 运行以下步骤:
text/html"
用一个
HTML 解析器解析
str,
并返回新
创建的文档。
脚本标志必须设为 "disabled"。
meta
元素不会被
纳入所用编码的考虑,因为传给
解析器的是 Unicode 流。
text/xml"
application/xml"
application/xhtml+xml"
image/svg+xml"
XML 解析器解析
str。
Document
接口,
而不是
XMLDocument
接口。
令 root 为一个新的
Element,
其
局部名
设为 "parsererror",并且其
命名空间
设为
"http://www.mozilla.org/newlayout/xml/parsererror.xml"。
此时,用户代理可以 向 root 追加节点, 例如用于描述错误的性质。
无论哪种情况,返回的
文档的
内容类型
必须是 type 参数。此外,该
文档必须具有一个
URL 值,其等于
活动文档的 URL,并且
location 值为 null。
| 参数 | 类型 | 可为空 | 可选 | 描述 |
|---|---|---|---|---|
| str | DOMString |
✘ | ✘ | |
| type | SupportedType |
✘ | ✘ |
DocumentXMLSerializer 接口
XMLSerializer()
构造函数必须返回一个新的 XMLSerializer 对象。
[Constructor]
interface XMLSerializer {
DOMString serializeToString (Node root);
};
serializeToStringserializeToString(root)
方法必须在为
require well-formed 参数传入值 false 的情况下,
产生 root 的 XML 序列化,
并返回结果。| 参数 | 类型 | 可为空 | 可选 | 描述 |
|---|---|---|---|---|
| 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,类型为 DOMString
innerHTML IDL
属性表示
Element
内容的标记。
innerHTML [ =
value ]
返回表示该元素 内容的一段 HTML 或 XML 片段。
可以设置,以用从给定字符串解析出的节点 替换该元素的内容。
在 XML 文档的情况下,
如果
Element
无法序列化
为 XML,则会抛出一个名称为
"InvalidStateError"
的
DOMException;
如果给定字符串不是格式良好的,则会抛出一个名称为
"SyntaxError"
的
DOMException。
获取时,返回在
上下文对象上调用
片段序列化算法的结果,并为
require well-formed 标志提供 true
(这可能会抛出异常,而不是返回字符串)。
设置时,必须运行以下步骤:
outerHTML,类型为 DOMString
outerHTML IDL
属性表示
Element
及其内容的标记。
outerHTML [ =
value ]
返回表示该元素及其 内容的一段 HTML 或 XML 片段。
可以设置,以用从给定 字符串解析出的节点替换该元素。
在 XML 文档的情况下,
如果该元素无法序列化为 XML,则会抛出一个名称为
"InvalidStateError"
的
DOMException;
如果给定字符串不是格式良好的,则会抛出一个名称为
"SyntaxError"
的
DOMException。
如果该元素的父节点是
Document
节点,则抛出一个名称为
"NoModificationAllowedError"
的
DOMException。
获取时,返回在一个虚构节点上调用
片段序列化算法的结果,
该虚构节点唯一的子节点是
上下文对象,
并为
require well-formed
标志提供 true(这可能会抛出异常,而不是返回字符串)。
设置时,必须运行以下步骤:
Document,
则抛出一个名称为
"NoModificationAllowedError"
的
DOMException
异常。
DocumentFragment,
则令
parent 为一个新的
Element,
并具有
insertAdjacentHTML
insertAdjacentHTML(position,
text)
将给定字符串 text 解析为 HTML 或 XML,并将 所得节点插入树中由 position 参数给定的位置,如下所示:
如果参数具有无效值(例如,在
XML 文档的情况下,给定字符串
不是格式良好的),则抛出一个名称为
"SyntaxError"
的
DOMException。
如果给定位置不可行(例如,在
Document
的根元素之后插入元素),则抛出一个名称为
"NoModificationAllowedError"
的
DOMException。
insertAdjacentHTML(position, text)
方法必须运行以下步骤:
如果 context 为 null 或是一个
文档,则抛出
一个名称为
"NoModificationAllowedError"
的
DOMException。
抛出一个名称为
"SyntaxError"
的
DOMException。
Element,
或以下条件均为真:
则令 context 为一个新的
Element,
并具有
| 参数 | 类型 | 可为空 | 可选 | 描述 |
|---|---|---|---|---|
| position | DOMString |
✘ | ✘ | |
| text | DOMString |
✘ | ✘ |
voidRange
接口扩展partial interface Range {
[CEReactions, NewObject]
DocumentFragment createContextualFragment (DOMString fragment);
};
createContextualFragment
createContextualFragment(markupString)
DocumentFragment。
createContextualFragment(fragment)
方法必须运行以下步骤:
根据 node 的接口,令 element 如下:
Document
DocumentFragment
Element
Text
Comment
DocumentType
ProcessingInstruction
则令 element 为一个新的 元素,并具有
| 参数 | 类型 | 可为空 | 可选 | 描述 |
|---|---|---|---|---|
| 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() 方法,并感谢他提供有用的评论。