Java 扩展JDOM文档

Java 扩展JDOM文档,java,jdom-2,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() { // ...

对于大学的一个项目,我需要解析一个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();
}
我得到一个Cast异常:

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进行子类化。我错过了什么

vat

一般来说,我想“挑战”您对扩展文档的要求-您从您的自定义类中获得了什么价值,这些自定义类还不是本机实现的一部分?我这样问有两个原因:

  • 作为JDOM的维护者,我应该添加一些新特性吗
  • 我只是好奇
JDOM有一个适当的系统,允许您扩展它的核心类,并在解析文档时使用它们的不同实现。它是通过扩展
JDOMFactory
来完成的

请考虑以下代码:。当
SAXParser
解析文档时,它使用这些方法来构建文档

有一个默认的、可重写的实现,您可以扩展它,例如,在您的实现中,您必须重写非最终的“元素”方法,如:

而是:

@Override
public Element element(final int line, final int col, final String name,
        String prefix, String uri) {
    return new GMLKnoten (name, prefix, uri);
}
请注意,您必须覆盖所有非最终方法,并返回要自定义的内容(例如,您必须根据我的计数覆盖4个
元素
方法)


使用您自己的
GMLJDOMFactory
就可以通过使用或设置
JDOMFactory

来使用SAXBuilder,这非常简单。
SAXBuilder
返回一个
org.jdom2.Document
而不是
GMLDatei
。如果您真的想实现这一点,您必须重新实现/扩展
SAX生成器
为了创建一个
GMLDatei
而不是一个基本的
文档
!@ParkerHalo是的,我知道,但我记得很久以前使用过这种方法,例如扩展一个JTable,它就起作用了。嗯……也许你当时自己创建了对象(新实例,关键字为new)但是这里的问题是SAXParser创建了您的文档实例!在调用saxBuilder之前,我将它实例化为null。我发现您缺少一些基本知识(无意冒犯)。方法
saxBuilder.build(inputFile)
创建了一个新实例(一个对象)不是
GMLDatei
类型的
org.jdom2.Document
。在您的行中,您尝试将
Document
类型的对象解析为
GMLDatei
,这是不可能的。这是我们对JDOM类进行子类化的两个不同原因。GMLDatei(子类文档):我们在设计类图时不知道XMLOutputter,现在更改upGMLKnoten(subclasses元素)为时已晚:使用JDOMs getChild-和getChildren方法时,尽管我们要获取的子元素存在,但我们始终会将null作为返回值。@vatbub-未获取所需子元素的最常见原因是因为它们不在您要查询的命名空间中。在查询子元素时,您将始终需要使用命名空间参数它们不在名称空间中。
@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);
}