扩展JDOM文档

时间:2016-01-21 09:10:34

标签: java jdom-2

对于大学的项目,我需要解析一个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的子类,所以铸造应该没问题。我错过了什么?

大桶

1 个答案:

答案 0 :(得分:0)

一般来说,我想“挑战”您扩展文档的要求 - 您从自定义类中获得的价值是什么?我问这有两个原因:

  • 作为JDOM的维护者,我应该添加一些新功能吗?
  • 我只是好奇.....

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(...)

来使用SAXBuilder