目前我在为公司编写工具时遇到问题。我有384个XML文件,我必须阅读并使用SAX Parser解析为txt文件。 到目前为止,我将所有XML文件解析为一个大小为43 MB的txt文件。使用BufferedReader和line.startsWith我想从文本文件中提取所有相关信息。
修改:完成 (所以我的问题是如何更有效地解决这个问题。我有一个想法(但不幸的是你没想到的代码),但我不知道它是否可能:我想迭代一个目录,找到XML文件我想要,然后解析它并用解析的内容创建一个新的txt文件。如果为所有384个XML文件做了我想要384 txt文件的相同的东西,用BufferedReader读取它们以获取我的相关信息。阅读很重要一个一个。另一个问题是目录路径,它有点复杂:“C:\ Users \ xxx \ Documents \ Data \ ProjectName \ A1 \ 1 \ 1SLin \ wanted.xml”对于每个文件都有一个自己的目录变量是A1,它从AP和1-24到达。或者我在arraylist中有绝对路径的所有相关文件,所以如果它更容易迭代这个列表也可以。)
修改 我找到了一个解决方案:下面包含搜索目录方法和一个将列表的xml文件解析到具有相同文件名但另一个文件扩展名的同一目录的方法
public List<File> searchFile(File dir, String find) {
File[] files = dir.listFiles();
List<File> matches = new ArrayList<File>();
if (files != null) {
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
matches.addAll(searchFile(files[i], find));
} else if (files[i].getName().equalsIgnoreCase(find)) {
matches.add(files[i]);
}
}
}
Collections.sort(matches);
return matches;
}
public static void main(String[] args) throws IOException {
Import_Files im = new Import_Files();
File dir = new File("C:\\Users\\xxx\\Desktop\\MS-Daten\\");
String name = "snp_result_5815.xml";
List<File> matches = im.searchFile(dir, name);
System.out.println(matches);
for (int i=0; i<matches.size(); i++) {
String j = String.valueOf(i);
String xml_name = matches.get(i).getAbsolutePath();
File f = new File(matches.get(i).getAbsolutePath().replaceFirst(".xml", ".txt"));
System.setOut(new PrintStream(new FileOutputStream(f)));
System.out.println("\nstarting File: "+ i + "\n");
xml_parse myReader = new xml_parse(xml_name);
myReader.setContentHandler(new MyContentHandler());
myReader.setErrorHandler(new MyErrorHandler());
myReader.run();
}
}
答案 0 :(得分:0)
下面的searchFolder
方法将采用路径和文件扩展名,搜索路径和所有子目录,并将任何匹配的文件类型传递给processFile
方法。
public static void main(String[] args) {
String path = "c:\\temp";
Pattern filePattern = Pattern.compile("(?i).*\\.xml$");
searchFolder(path, filePattern);
}
public static void searchFolder(String searchPath, Pattern filePattern){
File dir = new File(searchPath);
for(File item : dir.listFiles()){
if(item.isDirectory()){
//recursively search subdirectories
searchFolder(item.getAbsolutePath(), filePattern);
} else if(item.isFile() && filePattern.matcher(item.getName()).matches()){
processFile(item);
}
}
}
public static void processFile(File aFile){
String filename = aFile.getAbsolutePath();
String txtFilename = filename.substring(0, filename.lastIndexOf(".")) + ".txt";
//Do your xml file parsing and write to txtFilename
}
路径的复杂性没有区别,只需指定要搜索的根路径(在您的案例中看起来像C:\Users\xxx\Documents\Data\ProjectName
),它就会找到所有文件。