2015-09-01 169 views
0

我想解析一個xml文檔,搜索後發現sax是最好的選擇,但文檔非常大(1.5 GB)等待7分鐘,但它仍在運行 我的問題是,這是正常的嗎?或者我可以做得更好?使用Sax解析大型XML文件

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(); 
    } 

} 
+0

你是什麼意思與1.5? 1.5 mb? – Christian

+1

@Christian 1.5 GB –

+1

看看這個:http://stackoverflow.com/questions/3411773/parsing-big-xml-files-using-sax-parser-skip-some-lines-tags –

回答

2
  1. 你可以通過改變equalsIgnoreCaseequals節省一些時間(除非你真的遇到「價值」和「價值」和「值」 ......)
  2. 印刷很可能採取多數時間。 IO操作通常是瓶頸
+0

我打印測試,我將保存數據到數據庫,你有任何建議數據庫?時間很重要 –

+1

大多數數據庫引擎支持批量插入/更新(在一個語句中插入多行) - 使用它 –

+0

而不打印需要19秒!謝謝 –

1

如果解析如此龐大的文件,則應該使用Stax而不是Sax。使用Stax,您可以跳過文件的一部分,從而使文件更快,速度更快。

StAX是一種「拉」類型的API。正如所討論的那樣,有遊標和事件迭代器API。 API的讀寫方面都有。它比SAX更開發友好。像SAX一樣,StAX不需要將整個文檔保存在內存中。但是,與SAX不同,不需要讀取整個文檔。部分可以跳過。這可能會導致性能比SAX更高。

DOM vs SAX XML parsing for large files