在java中搜索xml文件以查看元素是否存在不起作用?

时间:2014-07-17 18:16:43

标签: java xml parsing

我有一个包含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

2 个答案:

答案 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);
         }
    }