【问题标题】:Parsing Large XML File Using Sax使用 Sax 解析大型 XML 文件
【发布时间】:2015-09-01 12:37:23
【问题描述】:

我正在尝试解析一个 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();
    }

}

【问题讨论】:

  • 1.5 是什么意思? 1.5 mb?
  • @NathanHughes 我第一次使用这个,有什么建议吗?
  • 我的建议:停止从 mkyong 获取错误代码,阅读 Oracle 文档,并遵循 sharonbn 的建议。
  • @NathanHughes 你能告诉我为什么这么糟糕吗?

标签: java xml parsing sax


【解决方案1】:
  1. 您可以通过将equalsIgnoreCase 更改为equals 来节省一些时间(除非您真的遇到“ValuE”和“value”和“VaLuE”......)
  2. 打印可能会占用大部分时间。 IO 操作通常是瓶颈

【讨论】:

  • 我正在打印测试,我要将数据保存到数据库,您对数据库有什么建议吗?时间很重要
  • 大多数数据库引擎支持批量插入/更新(在一个语句中插入多行)- 使用它
  • 根据我的个人经验,我可以给您的最后一个提示是,您需要注意解析器可能会为同一个 xml 元素多次调用 characters() 方法,并且您需要将结果连接到获取全文。然后您可以在endElement() 中进行处理(数据库调用等),请在此处查看详细信息stackoverflow.com/questions/4567636/…
  • 如果你的意思是实例变量,那么是的
【解决方案2】:

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

StAX 是一种“拉”类型的 API。如前所述,有游标和事件迭代器 API。 API 有读写两面。它比 SAX 对开发人员更友好。 StAX 与 SAX 一样,不需要将整个文档保存在内存中。但是,与 SAX 不同的是,不需要读取整个文档。部分可以跳过。与 SAX 相比,这可能会提高性能。

(DOM vs SAX XML parsing for large files)

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2023-03-18
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多