2015-03-30 84 views
0

我正在使用SAX(Simple API for XML)來解析XML文檔。我的目的是解析文檔,以便我可以將實體從XML中分離出來,並從這些實體創建一個ER圖(我將在獲得文件所有實體後手動創建)。 雖然我在編碼上面討論過的每一件事情都處於初始階段,但我現在只是停留在這個特定的問題上。閱讀XML獲取實體

這裏是我的代碼:

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class Parser extends DefaultHandler { 

    public void getXml() { 
    try { 
     SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = saxParserFactory.newSAXParser(); 
     final MySet openingTagList = new MySet(); 
     final MySet closingTagList = new MySet(); 
     DefaultHandler defaultHandler = new DefaultHandler() { 

     public void startDocument() throws SAXException { 
      System.out.println("Starting Parsing...\n"); 
     } 

     public void endDocument() throws SAXException { 
      System.out.print("\n\nDone Parsing!"); 
     } 

     public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
      if (!openingTagList.contains(qName)) { 
      openingTagList.add(qName); 
      System.out.print("<" + qName + ">"); 
      } 
     } 

     public void characters(char ch[], int start, int length) 
     throws SAXException { 
      for (int i = start; i < (start + length); i++) { 
      System.out.print(ch[i]); 
      } 
     } 

     public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
      if (!closingTagList.contains(qName)) { 
      closingTagList.add(qName); 
      System.out.print("</" + qName + ">"); 
      } 
     } 
     }; 

     saxParser.parse("student.xml", defaultHandler); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    public static void main(String args[]) { 
    Parser readXml = new Parser(); 
    readXml.getXml(); 
    } 
} 

我想要實現是當的startElement方法檢測到標籤已經走過它應該跳過標籤以及所有其他實體的標籤裏面,但我對如何實現該部分感到困惑。

注意:目的是讀取標籤,我不關心它們之間的記錄。 MySet只是一個抽象,它包含像contains這樣的方法(如果該集合具有傳遞的數據)等等。

任何幫助將被撥付。謝謝

+0

確切的問題是什麼?任何輸出?你的套件的內容是什麼? – chris 2015-03-30 19:15:21

+0

set只是一個由我實現的Vector,它包含一些更多的方法,就像檢查Set中是否存在該值一樣。 無論如何,問題是我如何實現功能來跳過所有的內部標籤,當已經遍歷的標籤被發現。 – 2015-03-30 19:21:20

+0

好的。你爲什麼想這樣做?這是一個巨大的文件嗎?我想你想收集標籤名稱 - 這應該已經適用於你的代碼。 – chris 2015-03-30 19:23:53

回答

0

由於xml的性質,無法知道哪些標籤稍後會出現在文件中。所以沒有'跳過下一個x字節'的技巧。
只需詢問合理大小的文件 - 也許有可能分割數據。
在我看來,閱讀一個超過1GB的XML文件是沒有意義的 - 無論使用的庫如何。

+0

那麼你如何建議我處理它呢?因爲我必須以任何方式做。 – 2015-03-30 19:46:02

+0

您的代碼運行速度有多快?你需要多長時間解析文件?確切的問題是什麼?正如我看到你的代碼應該可以正常工作。 – chris 2015-03-30 19:48:02

+0

該代碼工作正常,因爲我在一個小文件上測試它,但意圖是解析一個巨大的文件(1.46 GB)。所以我所要求的是更好的方式,因爲我是一個XML和解析東西的新手。 – 2015-03-30 19:50:26