【问题标题】:Reading XML for getting entities读取 XML 以获取实体
【发布时间】:2015-03-30 19:09:24
【问题描述】:

我正在使用 SAX(XML 的简单 API)来解析 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 只是我实现的一个 Vector,它包含更多方法,就像检查值是否已经存在于 Set 中一样。无论如何,问题是当找到已经遍历的标签时,我如何实现跳过所有内部标签的功能。
  • 嗯,好的。你为什么要这样做?它是一个巨大的文件吗?我认为您想收集标签名称 - 这应该已经适用于您的代码。
  • 是的,它是来自 DBLP (1.46 gb) 的文件,但首先我在小文件上对其进行测试。有些公司这样做,这就是我可以说的原因。巴士相同的标签一遍又一遍地重复,这就是我的问题是如何跳过
  • 经过一番阅读网络:恐怕这是不可能的,因为 sax(必须)访问所有节点。这是一个类似的问题:stackoverflow.com/questions/18064716/…。请注意一个答案中的 STAX 链接。也许这会对你有所帮助。

标签: java xml xml-parsing sax


【解决方案1】:

由于 xml 的性质,不可能知道哪些标签稍后会出现在文件中。所以没有“跳过下一个 x 字节”的技巧。
只需要求合理大小的文件 - 也许有可能拆分数据。
在我看来,阅读超过 1 gb 的 xml 文件并不好玩——不管使用什么库。

【讨论】:

  • 那么你建议我如何处理它?因为我必须以任何方式去做。
  • 您的代码运行速度有多快?你需要多长时间解析文件?确切的问题是什么?正如我所见,您的代码应该可以正常工作。
  • 代码工作正常,因为我在一个小文件上测试它,但目的是解析一个大文件(1.46 GB)。所以我所要求的只是一种更好的方法,因为我是 XML 和解析东西的新手。
  • SAX 是解析大文件的好方法,因为您不必将所有数据存储在 ram 中(就像使用 DOM 完成的那样)。我会使用你的代码。这是一个非常聪明的解决方案。
  • 好的,我研究了它并对此有所了解。你能建议我如何像 SAX 中的 DOM 一样创建父子层次结构吗?
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多