【发布时间】: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