2015-03-30 89 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