【问题标题】:find and replace on large kml files which contain html efficiently?有效地查找和替换包含 html 的大型 kml 文件?
【发布时间】:2013-10-25 05:14:37
【问题描述】:

编辑:这些文件已发布到我正在处理的网络服务器上,我现在手头没有它们,只是一个“代表性样本”。

我有很大的 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。如果这很重要,我可以尝试从中取出一堆东西来为互联网消毒。我认为其中可能有一些专有的东西。

【问题讨论】:

  • 你能给我们展示一下迭代代码以及kml文件的样本吗?
  • Sed 可能更简单、更快捷。

标签: java html xml


【解决方案1】:

txt+=行;

concat 运算符创建一个新字符串,其中包含左侧和右侧的连接。这涉及复制两个操作数中的所有字符。例如,在此循环的第 1000 次迭代中,它将复制 txt 的当前内容和 line 的内容。这是文件的前 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");
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 2017-01-10
    • 2011-02-16
    • 2013-09-06
    • 2012-09-24
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多