2016-01-21 66 views
0

對於大學的項目,我需要解析一個GML文件。 GML文件是基於XML的,因此我使用JDOM2來解析它。爲了適應我的目的,我延長org.jdom2.Document像這樣:擴展一個JDOM文檔

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); 

我得到一個演員的異常:

Exception in thread "main" java.lang.ClassCastException: org.jdom2.Document cannot be cast to datenbank.GMLDatei 
at datenbank.GMLTest.main(GMLTest.java:27) 

我認爲鑄造schould沒有proble因爲我是繼承org.jdom2.document。我錯過了什麼?

增值稅

+0

以及它很容易使用SAXBuilder的。 'SAXBuilder'返回'org.jdom2.Document'而不是'GMLDatei'。如果你真的想達到這個目的,你必須重新實現/擴展'SAXBuilder'來創建'GMLDatei'而不是基本的'Document'! – ParkerHalo

+0

@ParkerHalo是的,我知道,但我記得使用這種方法的年齡,例如,擴展了一個JTable並且工作。 – vatbub

+0

hm ...也許你自己創建了對象(新的關鍵字new)但是這裏的問題是SAXParser創建你的文檔實例! – ParkerHalo

回答

0

總的來說,我想「挑戰」您的要求來擴展文件 - 你從那些尚未在本土實現的一部分自定義類得到了什麼價值?我問這個原因有兩個:

  • 作爲JDOM的維護者,我應該添加一些新功能嗎?
  • 我只是好奇.....

JDOM已經有一套系統允許擴展它的核心類和具有不同的實現他們的解析文檔時。它通過擴展JDOMFactory完成。

請考慮這裏的代碼:JDOMFactory interface。當SAXParser解析文檔時,它使用這些方法來構建文檔。

有一個默認情況下,DefaultJDOMFactory覆蓋的實現,你可以擴展,並且,例如,在您的實現,必須覆蓋非最終的「元素」等的方法:

@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); 
} 

請注意,你將不得不重寫的非最終所有的方法和返回的內容是進行定製(爲電子商務xample,您將不得不通過我的計數覆蓋4 Element方法。

用自己的GMLJDOMFactory然後你可以使用full constructor new SAXBuilder(null, null, new GMPJDOMFactory())要麼或通過設置JDOMFactoryafter you have constructred it with setJDOMFactory(...)

+0

我們有兩個不同的原因,我們爲JDOM類的子類化。 GMLDatei(子類Document):在設計類圖時我們不知道XMLOutputter,現在要改變它已經太遲了 – vatbub

+0

GMLKnoten(子類Element):當使用JDOMs getChild-和getChildren-Methods時,我們總是得到null作爲回報,儘管我們想要得到的孩子存在。 – vatbub

+0

@vatbub - 不讓你期望的孩子最常見的原因是因爲他們不在你正在查詢的命名空間中。查詢名稱空間中的子元素時,您總是需要使用名稱空間參數。 – rolfl