对于大学的项目,我需要解析一个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的子类,所以铸造应该没问题。我错过了什么?
大桶
答案 0 :(得分:0)
一般来说,我想“挑战”您扩展文档的要求 - 您从自定义类中获得的价值是什么?我问这有两个原因:
JDOM有一个系统,允许您扩展它的核心类,并在解析文档时具有不同的实现。这是通过扩展JDOMFactory
。
请在此处考虑此代码:JDOMFactory interface。当SAXParser
解析文档时,它使用这些方法来构建文档。
DefaultJDOMFactory中有一个可以扩展的默认可覆盖实现,例如,在您的实现中,您必须覆盖非最终的“Element”方法,如:
@Override public Element element(final int line, final int col, final String name, String prefix, String uri) { return new Element(name, prefix, uri); }
而是:
@Override
public Element element(final int line, final int col, final String name,
String prefix, String uri) {
return new GMLKnoten (name, prefix, uri);
}
请注意,您必须覆盖所有非final的方法并返回要自定义的内容(例如,您必须按我的计数覆盖4个Element
方法。
使用您自己的GMLJDOMFactory
,您可以使用full constructor new SAXBuilder(null, null, new GMPJDOMFactory())
或设置JDOMFactory
after you have constructred it with setJDOMFactory(...)