读取XML以获取实体

时间:2015-03-30 19:09:25

标签: java xml xml-parsing sax

我使用SAX(Simple API for XML)来解析XML文档。我的目的是解析文档,以便我可以将实体与XML分开,并从这些实体创建一个ER图(我将在获得文件所有实体后手动创建)。 虽然我在编码上面讨论过的所有事情的初始阶段,但我在现在只是坚持这个特殊的问题。

这是我的代码:

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这样的方法(如果set有传递的数据)等等。

任何帮助都会被挪用。感谢

1 个答案:

答案 0 :(得分:0)

由于xml的性质,我们无法知道文件后面会出现哪些标签。因此,没有&#39;跳过下一个x字节&#39; -trick 只要求合理大小的文件 - 也许有可能分割数据。
在我看来,读取超过1 GB的xml文件并不好玩 - 无论使用哪个库。