найти и заменить на большие файлы кмл, которые содержат HTML эффективно?

0

EDIT: эти файлы отправляются на веб-сервер, над которым я работаю, сейчас у меня их нет, только "репрезентативная выборка".

У меня есть большие файлы kml (размер 80000 строк), возможно, больше, которые содержат xml и html, которые мне нужно найти для замены на определенных элементах xml.

а именно

<href>some_random_file_name<href>

Мне нужно заменить значение, присутствующее там, значением, которое я пытался использовать с чем-то похожим на это:

http://www.mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/

Но обнаружил, что html заставил анализатор исправить ошибки и не найти нужные элементы.

Прямо сейчас я повторяю файл по строкам и ищу нужные элементы, но это ужасно медленно. Мне нужен относительно эффективный способ справиться с этим.

Итерационный код:

            File kml = new File(kmlFile);
        FileReader reader = new FileReader(kml);
        BufferedReader br = new BufferedReader(reader);
        String txt="";
        String line = null;
        while((line = br.readLine())!= null) {
            if(line.contains("href")) {
                String tmp = line.replace("<href>","");
                tmp = tmp.replace("</href>","");
                tmp = tmp.replaceAll("\t", "");
                tmp = tmp.replaceAll("images/", "");
                line = "<href>"+namesToIds.get(tmp)+"</href>";
            }
            txt+=line;
        }

        br.close();
        FileWriter writer = new FileWriter(kml);
        BufferedWriter bw = new BufferedWriter(writer);
        bw.write(txt);
        bw.flush();
        bw.close();

Я не думаю, что могу поставить kml прямо сейчас. Если это жизненно важно, я могу попытаться вытащить из него кучу вещей, чтобы дезинформировать его для Интернета. Я думаю, что в нем могут быть некоторые проприетарные вещи.

  • 0
    Можете ли вы показать нам код итерации, а также образец файла kml?
  • 1
    Сед может быть проще и быстрее.
Теги:

1 ответ

1

txt+ = линия;

Оператор concat создает новую строку, содержащую конкатенацию левой и правой стороны. Это включает в себя копирование всех символов в обоих операндах. Например, в 1000-й итерации этого цикла он скопирует текущее содержимое txt и содержимое строки. Это первые 1001 строки файла. Иначе говоря, если у вас есть n строк в файле, вы скопируете строку текста n * (n + 1)/2 раза. Конечно, копирование одних и тех же строк снова и снова не является самым эффективным способом для этого.

Вместо этого вы должны накапливать преобразованный текст в StringBuilder или даже лучше, а не накапливать в памяти, но добавлять каждую строку в выходной файл так же, как вы его преобразовали.

Что-то вроде:

try (BufferedReader reader = new BufferedReader(new FileReader(kmlFile))) {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
        String line = null;
        while((line = br.readLine())!= null) {
            writer.write(convert(line));
            writer.write("\n");
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню