1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
---
title: DOMParser
slug: Web/API/DOMParser
tags:
- API
- DOM
- DOM Parsing
- Document
- XML
- 参考
translation_of: Web/API/DOMParser
---
<div>{{APIRef("DOM")}}</div>
<p><strong><code>DOMParser</code></strong> 可以将存储在字符串中的 {{Glossary("XML")}} 或 {{Glossary("HTML")}} 源代码解析为一个 DOM {{domxref("Document")}}。</p>
<div class="note">
<p><strong>注意:</strong>{{domxref("XMLHttpRequest")}} 支持从URL可寻址资源解析XML和HTML,在其{{domxref("XMLHttpRequest.response", "response")}} 属性中返回<code>Document</code>。</p>
</div>
<p>你可以使用{{domxref("XMLSerializer")}} 接口执行相反的操作 - 将DOM树转换为XML或HTML源。</p>
<p>对于HTML文档,您还可以通过设置 {{domxref("Element.innerHTML")}} 和{{domxref("Element.outerHTML", "outerHTML")}} 属性的值,将部分 DOM 替换为从HTML构建的新 DOM 树。还可以读取这些属性以获取对应于相应 DOM 子树的 HTML 片段。</p>
<h2 id="语法">语法</h2>
<pre class="brush: js">let <em>domparser</em> = new DOMParser();</pre>
<h2 class="brush: js" id="方法">方法</h2>
<p>{{domxref("DOMParser.parseFromString()")}}</p>
<h3 id="语法_2">语法</h3>
<pre class="brush: js"><em>let </em><strong>doc</strong><em><strong> </strong>= domparser.</em>parseFromString(<em>string</em>, <em>mimeType</em>)</pre>
<h3 id="返回值">返回值</h3>
<p>基于 <strong><code><a href="#Argument02">mimeType</a></code></strong> 参数,返回 {{domxref("Document")}} 或 {{domxref("XMLDocument")}} 或其他文档类型。</p>
<h3 id="参数">参数</h3>
<p>该方法接收 2 个必要参数:</p>
<dl>
<dt><code>string</code></dt>
<dd>要解析的 {{domxref("DOMString")}}。它必须包含 {{Glossary("HTML")}}、{{Glossary("xml")}}、{{Glossary("xhtml+xml")}} 或 {{Glossary("svg")}} 文档。</dd>
<dt><a id="Argument02"></a></dt>
<dt><code>mimeType</code></dt>
</dl>
<dl>
<dd>一个 {{domxref("DOMString")}}。This string determines a class of the the method's return value. The possible values are the following:</dd>
</dl>
<table class="standard-table" style="max-width: 50%;">
<thead>
<tr>
<th scope="col"><code>mimeType</code></th>
<th scope="col">doc.constructor</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>text/html</code></td>
<td><code>{{domxref("Document")}}</code></td>
</tr>
<tr>
<td><code>text/xml</code></td>
<td><code>{{domxref("XMLDocument")}}</code></td>
</tr>
<tr>
<td><code>application/xml</code></td>
<td><code>{{domxref("XMLDocument")}}</code></td>
</tr>
<tr>
<td><code>application/xhtml+xml</code></td>
<td><code>{{domxref("XMLDocument")}}</code></td>
</tr>
<tr>
<td><code>image/svg+xml</code></td>
<td><code>{{domxref("XMLDocument")}}</code></td>
</tr>
</tbody>
</table>
<h2 id="解析_XML">解析 XML</h2>
<p>一旦建立了一个解析对象以后,你就可以使用它的 <code>parseFromString</code> 方法来解析一个 XML 字符串:</p>
<pre class="brush: js">let parser = new DOMParser(),
doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
</pre>
<h4 id="错误处理">错误处理</h4>
<p>如果解析失败, <code>DOMParser</code> 不会抛出任何异常,而是会返回一个给定的错误文档:</p>
<pre class="brush:xml"><parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">
(error description)
<sourcetext>(a snippet of the source XML)</sourcetext>
</parsererror>
</pre>
<p>解析错误会显示在<a href="../../../zh-cn/Error_Console">错误控制台</a>,包括文档的地址和错误的源代码。</p>
<h2 id="解析_SVG_或者_HTML_文档">解析 SVG 或者 HTML 文档</h2>
<p><code>DOMParser</code> 也可以用来解析 SVG 文档 {{geckoRelease("10.0")}} 或者 HTML 文档 {{geckoRelease("12.0")}}。根据给定的 MIME 类型不同,<code>parseFromString</code> 方法可能返回三种不同类型的文档。如果MIME类型是 <code>text/xml</code>,则返回一个 <code>XMLDocument</code>,如果 MIME 类型是 <code>text/svg+xml</code>,则返回一个 <code>SVGDocument</code>,如果MIME类型是 <code>text/html</code>,则返回一个 <code>HTMLDocument</code>。</p>
<pre class="brush: js">let parser = new DOMParser();
let doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
// 返回一个 Document 对象,但不是 SVGDocument,也不是 HTMLDocument
parser = new DOMParser();
doc = parser.parseFromString(stringContainingXMLSource, "image/svg+xml");
// 返回一个 SVGDocument 对象,同时也是一个 Document 对象。
parser = new DOMParser();
doc = parser.parseFromString(stringContainingHTMLSource, "text/html")
// 返回一个 HTMLDocument 对象,同时也是一个 Document 对象。
</pre>
<h2 id="DOMParser_HTML_扩展">DOMParser HTML 扩展</h2>
<pre class="brush: js">/*
* DOMParser HTML extension
* 2012-09-04
*
* By Eli Grey, http://eligrey.com
* Public domain.
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/
/*! @source https://gist.github.com/1129031 */
/*global document, DOMParser*/
(function(DOMParser) {
"use strict";
var proto = DOMParser.prototype,
nativeParse = proto.parseFromString;
// Firefox/Opera/IE throw errors on unsupported types
try {
// WebKit returns null on unsupported types
if ((new DOMParser()).parseFromString("", "text/html")) {
// text/html parsing is natively supported
return;
}
} catch (ex) {}
proto.parseFromString = function(markup, type) {
if (/^\s*text\/html\s*(?:;|$)/i.test(type)) {
var
doc = document.implementation.createHTMLDocument("")
;
if (markup.toLowerCase().indexOf('<!doctype') > -1) {
doc.documentElement.innerHTML = markup;
}
else {
doc.body.innerHTML = markup;
}
return doc;
} else {
return nativeParse.apply(this, arguments);
}
};
}(DOMParser));</pre>
<h2 id="规范">规范</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">规范</th>
<th scope="col">状态</th>
<th scope="col">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('DOM Parsing', '#the-domparser-interface', 'DOMParser')}}</td>
<td>{{Spec2('DOM Parsing')}}</td>
<td>Initial definition</td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p>{{Compat("api.DOMParser", 3)}}</p>
<h2 id="参见">参见</h2>
<ul>
<li><a href="/en-US/docs/Parsing_and_serializing_XML">Parsing and serializing XML</a></li>
<li>{{domxref("XMLHttpRequest")}}</li>
<li>{{domxref("XMLSerializer")}}</li>
<li>{{jsxref("JSON.parse()")}} - counterpart for {{jsxref("JSON")}} documents.</li>
</ul>
|