2013-10-24 48 views
0

編輯:這些文件發佈到我正在處理的Web服務器上,我現在沒有把它們全部放在眼前,只有一個「有代表性的樣本」。找到並替換包含html的大kml文件有效?

我有很大的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文件的樣本? – plalx

+1

[Sed](https://en.wikipedia.org/wiki/Sed)可能更簡單快捷。 – ceving

回答

1

txt + = line;

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