XML 解析与 DOM 实现创建方法

发布于 2024-12-09 10:09:10 字数 989 浏览 0 评论 0原文

我记得很清楚,使用 DOM 实现在文档上创建新的 HTML 元素被认为比将 HTML 字符串分配给适用 HTML 元素的“innerHTML”属性要慢得多。

使用 JavaScript 创作 XML 文档时是否同样适用?与使用 DOM 实现的各种创建方法相比,直接生成 XML 字符串并解析它会更快吗?

只是我想知道的事情......:)

*编辑 - 添加了一个示例 *

哪个更快? (我将使用 jQuery 的 parseXML 函数来执行解析示例):

var myXdoc = $.parseXML("<person><name>Bob</name><relation>Uncle</relation>");

或者

var myXdoc

if (window.ActiveXObject) {
    myXdoc = new ActiveXObject("Microsoft.XMLDOM");
    myXdoc.async = false;
}
else if (document.implementation && document.implementation.createDocument)
    myXdoc = document.implementation.createDocument("", "", null);

var p = myXdoc.documentElement.appendChild(myXdoc.createElement("person"));
var n = p.appendChild(myXdoc.createElement("name"));
n.appendChild(myXdoc.createTextNode("Bob"));
var r = p.appendChild(myXdoc.createElement("relation"));
r.appendChild(myXdoc.createTextNode("Uncle"));

I remember well that using the DOM implementation to create new HTML elements on a document was considered to be very much slower than assigning an HTML string to the 'innerHTML' property of the applicable HTML element.

Does the same apply when authoring XML documents using JavaScript? Rather than using the DOM implementation's various create methods, would it be faster to just generate the XML string and parsing it?

Just something I wondered about.... :)

*EDIT - Added an example *

Which is faster? (I'll be using jQuery's parseXML function to do the parsing example):

var myXdoc = $.parseXML("<person><name>Bob</name><relation>Uncle</relation>");

Or

var myXdoc

if (window.ActiveXObject) {
    myXdoc = new ActiveXObject("Microsoft.XMLDOM");
    myXdoc.async = false;
}
else if (document.implementation && document.implementation.createDocument)
    myXdoc = document.implementation.createDocument("", "", null);

var p = myXdoc.documentElement.appendChild(myXdoc.createElement("person"));
var n = p.appendChild(myXdoc.createElement("name"));
n.appendChild(myXdoc.createTextNode("Bob"));
var r = p.appendChild(myXdoc.createElement("relation"));
r.appendChild(myXdoc.createTextNode("Uncle"));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

找个人就嫁了吧 2024-12-16 10:09:10

首先我们必须知道为什么 createDocument() 可能会很慢。原因是 DOM 是活动的,如果您修改它,它会触发 DOM 树的重新验证,并且可能会触发站点的重绘。每次。但是我们可以通过使用 createDocumentFragment()。 DocumentFragment 不是 DOM 的一部分,因此它不会触发任何事件。因此,您可以构建完整的 DOM 部分,并在最后一步将其附加到 DOM 树。我认为这是创建大型 DOM 部件的最快方法。

更新
我在 Firefox 7 中使用 Firebug 对其进行了测试。代码:

console.time("a");
for(var i=0; i<1000; i++) {
$.parseXML("<person><name>Bob</name><relation>Uncle</relation></person>")
}
console.timeEnd("a");

console.time("b");
for(var i=0; i<1000; i++) {
var myXdoc
if (document.createDocumentFragment) {
    myXdoc = document.createDocumentFragment();
}
var p = myXdoc.appendChild(document.createElement("person"));
var n = p.appendChild(document.createElement("name"));
n.appendChild(document.createTextNode("Bob"));
var r = p.appendChild(document.createElement("relation"));
r.appendChild(document.createTextNode("Uncle"));
}
console.timeEnd("b");

结果:“a”约 140ms,“b”约 35ms。所以字符串解析版本比较慢。

更新2
很可能第二个变体在任何其他浏览器中也更快。因为解析方法也必须构建 DOM 对象,并且很可能它使用相同的方法(例如:document.createElement)。所以解析方法不能更快了。但它比较慢,因为它必须首先解析字符串。

The first thing we have to know why createDocument() might be slow. The reason is that the DOM is alive and if you are modifying it, it triggers a re-validation of the DOM tree and probably a redraw of the site. Every time. But we could avoid this unnecessary re-validation and re-draw by using createDocumentFragment(). The DocumentFragment isn't part of the DOM and so it wont trigger any events. So you can build your complete DOM part and in the last step append it to the DOM tree. I think it's the fastest way to create large DOM parts.

UPDATE
I tested it in Firefox 7 using Firebug. The code:

console.time("a");
for(var i=0; i<1000; i++) {
$.parseXML("<person><name>Bob</name><relation>Uncle</relation></person>")
}
console.timeEnd("a");

console.time("b");
for(var i=0; i<1000; i++) {
var myXdoc
if (document.createDocumentFragment) {
    myXdoc = document.createDocumentFragment();
}
var p = myXdoc.appendChild(document.createElement("person"));
var n = p.appendChild(document.createElement("name"));
n.appendChild(document.createTextNode("Bob"));
var r = p.appendChild(document.createElement("relation"));
r.appendChild(document.createTextNode("Uncle"));
}
console.timeEnd("b");

The result: "a" about 140ms and "b" about 35ms. So the string parse version is slower.

UPDATE2
It's very likely that the second variant is faster in any other browser, too. Because the parse method has to build the DOM object too and it's very likely that it uses the same methods (e.g.: document.createElement). So the parse method can't be faster. But it's slower because it has first to parse the string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文