使用Sax解析大型XML文件

时间:2015-09-01 12:37:24

标签: java xml parsing sax

我正在尝试解析一个xml文档,搜索后我发现sax是最好的选择,但文档非常大(1.5 GB)等待7分钟,但它仍在运行 我的问题是,这是正常的吗?或者我可以做得更好?

public static void main(String argv[]) {

    try {

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        DefaultHandler handler = new DefaultHandler() {

            int c = 0;
            boolean id = false;
            boolean value = false;
            boolean orgin = false;
            boolean note = false;

            @Override
            public void startElement(String uri, String localName, String eName,
                    Attributes attributes) throws SAXException {

                if (eName.equalsIgnoreCase("ID")) {
                    id = true;
                }

                if (eName.equalsIgnoreCase("VALUE")) {
                    value = true;
                }

                if (eName.equalsIgnoreCase("ORGIN")) {
                    orgin = true;
                }

                if (eName.equalsIgnoreCase("NOTE")) {
                    note = true;
                }

            }

            @Override
            public void endElement(String uri, String localName,
                    String eName) throws SAXException {

            }

            @Override
            public void characters(char ch[], int start, int length) throws SAXException {

                if (id) {
                    System.out.println(new String(ch, start, length));
                    id = false;
                    System.out.println("record num : "+c++);
                }

                if (value) {
                    System.out.println(new String(ch, start, length));
                    value = false;
                }

                if (orgin) {
                    System.out.println(new String(ch, start, length));
                    orgin = false;
                }

                if (note) {
                    System.out.println(new String(ch, start, length));
                    note = false;
                }

            }

        };

        saxParser.parse("./transactions.xml", handler);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

2 个答案:

答案 0 :(得分:2)

  1. 您可以通过将xyz更改为equalsIgnoreCase来节省一些时间(除非您真的遇到" ValuE"和" valUE"以及" VaLuE&# 34; ...)
  2. 打印可能占用大部分时间。 IO操作通常是瓶颈

答案 1 :(得分:1)

如果你解析这么大的文件,你应该使用Stax而不是Sax。使用Stax,您可以跳过部分文件,使文件更快,速度更快。

  

StAX是一个"拉" API的类型。如上所述,有Cursor和Event Iterator API。 API有读写两面。它比SAX更适合开发人员。与SAX一样,StAX不需要将整个文档保存在内存中。但是,与SAX不同,不需要读取整个文档。部分可以跳过。这可能导致性能甚至比SAX提高。

DOM vs SAX XML parsing for large files