Улучшение поиска с помощью XML-файла


Я работаю на функцию, которая извлекает данные из XML-документа и сравните с тем, что набирает пользователь. Можете ли вы предложить какие-либо способы, которыми я могу улучшить его? Переменных в xml-файле сравниваются с txtSearch.

function checkXML() {
    var s = "";
    var albumPages = [];

    for (var i = 0; i < xmlalbums.length; i++) {
        var xmlalbum = xmlalbums[i];
        var album_title = dataFromTag(xmlalbum, 'title');
        var artist = dataFromTag(xmlalbum, 'artist');
        var xmltracks = xmlalbum.getElementsByTagName('track');
        for (var t = 0; t < xmltracks.length; t++) {
            var track = xmltracks[t];
            song_title = dataFromTag(track, 'title')
            albumPages[albumPages.length] = artist.toUpperCase() + ':' + album_title.toUpperCase() + ':' + song_title.toUpperCase();
        }
    }

    var resultList = '';
    var resultCount = [];

    for (var i = 0; i < albumPages.length; i++) {
        var searchArtist = albumPages[i].substring(0, albumPages[i].indexOf(":"));
        var searchAlbum = albumPages[i].substring(albumPages[i].indexOf(":") + 1, albumPages[i].lastIndexOf(":"));
        var searchSong = albumPages[i].substring(albumPages[i].lastIndexOf(":") + 1, albumPages[i].length);
        if (searchArtist.indexOf(txtSearch) != -1 || searchAlbum.indexOf(txtSearch) != -1 || searchSong.indexOf(txtSearch) != -1) {
            resultList += "<option>" + searchSong + "</option>"
            resultCount[resultCount.length] = i;
        }
    }

    if (resultList.length == 0) {
        s += "<span style='font-size: 2em;color: #fff;font-family: Arial;'>No result found!</span>"
    }
    else if (resultList.length > 0) {
        s += '<select size="' + (resultCount.length + 1) + '" onclick="parent.col3(value);">';
        s += resultList;
        s += '</select>';
    }
    else {
        s += "<span style='font-size: 2em;color: #fff;font-family: Arial;'>Awaiting search query...</span>"
    }

    with(document.getElementById('col2').contentDocument) {
        open();
        write(s);
        close();
    }
}


839
3
задан 15 декабря 2011 в 11:12 Источник Поделиться
Комментарии
4 ответа

Несколько общих вещей, от быстрой проверки:


  • объявлять все переменные вверху в одном Варе заявление, а не использовать его на протяжении всего сценария

  • использовать somearray.нажимаем(х) , а не somearray[somearray.длина]=х, как его короче, а значит, вам не придется искать .длина собственность каждый раз в цикле

  • в общем, избежать с; существует множество причин, например http://www.yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/

  • конкатенация строк-это медленно, а не много += операторы, создать массив, используйте .нажать() , чтобы добавить строки в массив, а затем использовать .присоединяйтесь к(") , Чтобы объединить их вместе.

И да, в XPath бы быть лучшим подходом для извлечения данных из XML.

2
ответ дан 15 декабря 2011 в 11:12 Источник Поделиться

Я бы создает локальную переменную для albumPages[я] во втором цикле for:

for (var i = 0; i < albumPages.length; i++) {
var albumPage = albumPages[i];
var searchArtist = albumPage.substring(0, albumPage.indexOf(":"));
...
}

Это сняло бы много ненужных индексации и сделать код более удобным для чтения.

Но... во первых для кода связывает художника, название альбома и название песни Струны, а во втором цикле он разбирает ее со строковыми функциями. Вы не должны этого делать, это выглядит совершенно ненужным. Использовать лучше структуру данных (класс, структура, массив и т. д. - Я не знаю, JavaScript и так хорошо), хранить свои данные в нее в первый цикл и перебрать его во втором цикле без разбора.

1
ответ дан 16 декабря 2011 в 12:12 Источник Поделиться

Как именно вы хотите его улучшить?


  • лучшую производительность?

  • лучше актуальность и полнота результатов поиска?

  • лучшая сопровождаемость кода?

  • лучше надежности / безопасности?

Одна очевидная критика заключается в том, что генерация XML/HTML-данных, используя конкатенацию строк как (а) неэффективно, и (Б) вероятность возникновения ошибки (например, не делается никаких попыток, чтобы избежать специальных символов или обнаружить специальные последовательности как "]]>")

1
ответ дан 16 декабря 2011 в 12:12 Источник Поделиться

Я не сравнили различные процессы, но это мое убеждение, что с помощью XPath, чтобы пройти/разобрать ваш XML будет гораздо лучшим вариантом, чем использование методов string.

Это большая тема, но вы можете начать здесь

-1
ответ дан 15 декабря 2011 в 11:12 Источник Поделиться