【问题标题】:Reading multiple xml files java读取多个xml文件java
【发布时间】:2019-03-09 18:08:17
【问题描述】:

我有大约 25000 个 XML 文件需要在 java 中读取。这是我的代码:

private static void ProcessFile() {
    try {


        File fXmlFile = new File("C:/Users/Emolk/Desktop/000010.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);


        doc.getDocumentElement().normalize();

        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("sindex");

        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            System.out.println("");

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                System.out.println("Name : " + eElement.getElementsByTagName("name").item(0).getTextContent());
                System.out.println("Count : " + eElement.getElementsByTagName("count").item(0).getTextContent());

                Entity CE = new Entity(eElement.getElementsByTagName("name").item(0).getTextContent(), Integer.parseInt(eElement.getElementsByTagName("count").item(0).getTextContent()));
                Entities.add(CE);
                System.out.println("Entity added! ");
            }
        }
        System.out.println(Entities);
        } catch (Exception e) {
        e.printStackTrace();
        }
}

我如何读取 25000 个文件而不是一个文件?

我尝试使用以下方法将所有 xml 文件连接在一起:https://www.sobolsoft.com/howtouse/combine-xml-files.htm

但这给了我这个错误:

[Fatal Error] joined.xml:130:2: The markup in the document following the 
root element must be well-formed.

【问题讨论】:

  • 显示那些 25k xml 文件的样本并解释您要做什么。为什么要一次阅读所有这些文件???
  • 以同样的方式做任何事情 25000 次:一个循环
  • @KishanCS 一个 XML 文件:ufile.io/dny1h 我需要一次处理所有 25k 以将内容提取到 Java 中。

标签: java xml merge


【解决方案1】:

如果性能不是问题,那么您可以执行以下操作,

    import java.io.File;
    import java.util.List;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;

    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;

    public class ReadFiles {
        public static void main(String[] args) {

            File dir = new File("D:/Work"); //Directory where your file exists

            File [] files = dir.listFiles();

            for(File file : files) {
                if(file.isFile() && file.getName().endsWith(".xml")) { //You can validate file name with extension if needed
                    ProcessFile(file, Entities);  // Assumed you have declared Entities, may be list of other collection
                }
            }

            System.out.println(Entities);
        }

        private static void ProcessFile(File fXmlFile, List<E> Entities) {
            try {

                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);

                doc.getDocumentElement().normalize();

                System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

                NodeList nList = doc.getElementsByTagName("sindex");

                System.out.println("----------------------------");

                for (int temp = 0; temp < nList.getLength(); temp++) {

                    Node nNode = nList.item(temp);

                    System.out.println("");

                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                        Element eElement = (Element) nNode;

                        System.out.println("Name : " + eElement.getElementsByTagName("name").item(0).getTextContent());
                        System.out.println("Count : " + eElement.getElementsByTagName("count").item(0).getTextContent());

                        Entity CE = new Entity(eElement.getElementsByTagName("name").item(0).getTextContent(), Integer.parseInt(eElement.getElementsByTagName("count").item(0).getTextContent()));
                        Entities.add(CE);
                        System.out.println("Entity added! ");
                    }
                }           
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

【讨论】:

  • 谢谢,我回家试试。
【解决方案2】:

要读取多个文件,您应该使用某种循环进行迭代。您可以扫描目录中的所有有效文件。

File folder = new File("path/to/directory");
File[] files = folder.listFiles();

for (int i = 0; i < files.length; i++) {
    // you can also filter for .xml if needed
    if (files[i].isFile()) {
        // parse the file
    }
}

接下来,您需要决定如何解析文件:顺序并行。 由于您使用多个线程来解析文件,因此并行速度要快得多。

一个线程

您可以重复使用您已经编写的代码,并循环访问文件:

for (File file : files) {
    processFile(file, yourListOfEntities);
}

多线程:

获取ScheduledExecutorService 并提交多个任务。

ExecutorService service = Executors.newFixedThreadPool(5);

for (File file : files) {
    service.execute(() -> processFile(file, yourListOfEntities));
}

这里有一个重要说明:ArrayList 的默认实现不是线程安全的,因此您应该(因为List 被多个线程使用)同步访问它:

List<Entity> synchronizedList = Collections.synchronizedList(yourListOfEntities);

另外,DocumentBuilder 不是线程安全的,应该为每个线程创建一次(如果你只是调用你的方法,你就对了)。如果您考虑对其进行优化,则此注释仅适用于这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多