Я пытаюсь извлечь несколько строк, представляющих некоторые элементы XML из файла. Пользователь предоставляет файл, используя простой <input type="file">
тег, и чем этот файл читается как текст с FileReader
и дал в качестве параметра этой функции:javascript indexOf с миллионами совпадений
var relevantDelimiters = [{"begin":"<header>","end":"</header>"}
,{"begin":" <someElement>","end":"</someElement>"}];
function dealWithString(invalidXML) {
var validXML = "";
for (var i=0; i<relevantDelimiters.length; i++) {
delimiter = relevantDelimiters[i];
while (invalidXML.indexOf(delimiter.begin) != -1) {
//while there are relevant elements of this kind left:
startPos = invalidXML.indexOf(delimiter.begin);
endPos = invalidXML.indexOf(delimiter.end);
//append to end result:
validXML+=invalidXML.substring(startPos,endPos+delimiter.end.length)+"\n";
//take this item out of the input to process next item
invalidXML = invalidXML.replace(invalidXML.substring(startPos,endPos+delimiter.end.length),"");
}
}
//return fixed data
return validXML;
}
Этот подход, кажется, работает очень хорошо с небольшим количеством совпадений во входном текстовом файле, но при заданном файле 1.5MB скрипт застревает (работает с Google Chrome, что делает его вкладчиком неактивным). Этот файл содержит около миллиона «релевантных элементов», что означает совпадения от relevantDelimiters
.
Как это можно оптимизировать?
Вы можете использовать [WebWorker] (https: //developer.mozilla. org/en-US/docs/Web/API/Web_Workers_API/basic_usage), так что пользовательский интерфейс браузера может продолжать работать во время поиска. –
@JuanMendes: Это звучит как * ответ * для меня. –
Довольно тяжелая манипуляция строк здесь, и хотя есть способы улучшить производительность, я задаюсь вопросом, не могли бы вы получить больше ударов за свой доллар, передав его через XSL-шаблон, чтобы удалить нежелательные узлы XML. – wwwmarty