我有一个包含3个文件的目录。这应该循环遍历文件并处理每个xml文件。它会查找元素“Booking”或“BookingOutputPlan”,具体取决于它所在的元素,它以不同的方式处理。
NodeList l = null;
NodeList n = null;
int counter = 0;
for (counter = 0; counter < files.size(); counter++) {
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(files.get(counter));
l = d.getElementsByTagName("Booking");
n = d.getElementsByTagName("BookTripPlanOutput");
}
for (int i = 0; i < l.getLength(); ++i) {
GMFiles.add(files.get(i));
processGMXml(GMFiles, prop, log);
}
for (int a = 0; a < n.getLength(); ++a) {
ACFiles.add(files.get(a));
processACXml(ACFiles, prop, log);
}
}
我通过这样做得到文件的arraylist:
Properties prop = new Properties();
InputStream in = null;
in = new FileInputStream("config.properties");
// load a properties file
prop.load(in);
in.close();
// location of directory
File directory = new File(prop.getProperty("directory"));
// creates array list of files
ArrayList<File> files = new ArrayList<File>();
// gets all the files in that directory and puts into array
if (directory.isDirectory()) {
File[] listFiles = directory.listFiles();
for (File file : listFiles) {
if (file.isFile()) {
files.add(file.getAbsoluteFile());
}
}// end of for-loop listFiles
答案 0 :(得分:0)
缩进有点奇怪,但我认为它的编写方式,NodeLists l和n将始终只包含最后一个文件中的节点列表,因为在解析NodeLists之前,你的初始for循环完全完成。
您需要将两个解析for循环放在初始for循环中。要么是这个,要么在每个文件迭代中附加到节点列表而不是分配。
答案 1 :(得分:0)
你正在覆盖l和n的值,因为第一个for循环一直运行到最后一个文件。只有这样才会出现循环并执行最后2个循环。调用解析方法的最后两个循环应该在你的第一个for循环中。
NodeList l = null;
NodeList n = null;
int counter = 0;
for (counter = 0; counter < files.size(); counter++) {
Document d =DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(files.get(counter));
l = d.getElementsByTagName("Booking");
n = d.getElementsByTagName("BookTripPlanOutput");
for (int i = 0; i < l.getLength(); ++i) {
GMFiles.add(files.get(i));
processGMXml(GMFiles, prop, log);
}
for (int a = 0; a < n.getLength(); ++a) {
ACFiles.add(files.get(a));
processACXml(ACFiles, prop, log);
}
}