【发布时间】:2016-01-21 09:10:33
【问题描述】:
对于大学的一个项目,我需要解析一个 GML 文件。 GML 文件是基于 XML 的,所以我使用 JDOM2 来解析它。为了符合我的目的,我像这样扩展了 org.jdom2.Document:
package datenbank;
import java.io.File;
// some more imports
public class GMLDatei extends org.jdom2.Document {
public void saveAsFile() {
// ...
}
public GMLKnoten getRootElement(){
return (GMLKnoten) this.getDocument().getRootElement();
}
public void setRootElement(GMLKnoten root){
this.getDocument().setRootElement(root);
}
}
我还扩展了 org.jdom2.Element 并将子类命名为 GMLKnoten,但这对我的问题来说并不重要。
测试时,我尝试加载 GML 文件。使用本机文档和元素类时,它可以正常加载,但是在使用我的子类时,我会遇到以下情况:
我使用以下方式加载文件:
SAXBuilder saxBuilder = new SAXBuilder();
File inputFile = new File("gml/Roads_Munich_Route_Lines.gml");
GMLDatei document = null;
ArrayList<String> types = new ArrayList<String>();
try {
document = (GMLDatei) saxBuilder.build(inputFile);
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
排队
document = (GMLDatei) saxBuilder.build(inputFile);
我得到一个 Cast-Exception:
Exception in thread "main" java.lang.ClassCastException: org.jdom2.Document cannot be cast to datenbank.GMLDatei
at datenbank.GMLTest.main(GMLTest.java:27)
我认为转换应该没有问题,因为我是 org.jdom2.document 的子类。我错过了什么?
大桶
【问题讨论】:
-
这很容易。
SAXBuilder返回org.jdom2.Document而不是GMLDatei。如果您真的想实现这一点,则必须重新实现/扩展SAXBuilder以创建GMLDatei而不是基本的Document! -
@ParkerHalo 是的,我知道,但我记得使用这种方法已经很久了,例如扩展一个 JTable 并且它起作用了。
-
hm...也许您当时自己创建了对象(带有关键字 new 的新实例)但是这里的问题是 SAXParser 创建了您的文档实例!
-
在调用 SAXBuilder 之前,我将它实例化为 null 一些行
-
好吧,我看到您在这里缺少一些基本知识(无意冒犯)。方法
saxBuilder.build(inputFile)创建了一个org.jdom2.Document的新实例(对象),它不是GMLDatei类型。在您的行中,您尝试将Document类型的对象解析为GMLDatei这是不可能的