Синтаксический анализ XML и методы создания реализации DOM

#javascript #xml #parsing #dom

#javascript #xml #синтаксический анализ #dom

Вопрос:

Я хорошо помню, что использование реализации DOM для создания новых HTML-элементов в документе считалось намного медленнее, чем присвоение HTML-строки свойству ‘innerHTML’ применимого элемента HTML.

Применяется ли то же самое при создании XML-документов с использованием JavaScript? Вместо того, чтобы использовать различные методы создания реализации DOM, было бы быстрее просто сгенерировать строку XML и проанализировать ее?

Просто кое-что, о чем я задумался …. 🙂

* РЕДАКТИРОВАТЬ — добавлен пример *

Что быстрее? (Я буду использовать функцию parseXML от jQuery для выполнения примера синтаксического анализа):

 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 amp;amp; 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"));
  

Комментарии:

1. Вы спрашиваете, быстрее ли использовать innerHTML для анализа строки xml? Или есть innerXml реализация, о которой я не знаю?

2. Нет, я сравнивал использование innerHTML с использованием синтаксического анализа XML. Так же, как innerHTML был быстрее, чем использование, например, document.createElement («таблица»).

Ответ №1:

Первое, что мы должны знать, почему 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» около 140 мс, а «b» около 35 мс. Таким образом, версия синтаксического анализа строк работает медленнее.

UPDATE2 Очень вероятно, что второй вариант работает быстрее и в любом другом браузере. Потому что метод parse также должен создавать объект DOM, и очень вероятно, что он использует те же методы (например: document.createElement ). Поэтому метод parse не может быть быстрее. Но это медленнее, потому что сначала нужно проанализировать строку.

Комментарии:

1. Я знаю, что именно этот подход jQuery использует для ускорения создания новых элементов HTML. Но обычная реализация начинается со строкового представления предполагаемого HTML. Я обновлю свой вопрос примером.

2. Я посмотрел, как jQuery «анализирует» строку HTML, о которой я упоминал выше. Оказывается, что innerHTML используется не только. С помощью серии регулярных выражений и других строковых функций они создают узлы HTML, используя как свойство innerHTML, так и некоторую реализацию DOM.

3. Большое спасибо, я уже определил несколько мест в своем коде, где можно повысить производительность, переключившись с синтаксического анализа на реализацию DOM.