# JDOM, XML in Documet-Subklasse laden



## r2k (31. Mrz 2005)

Eine Klasse DocExt ist abgeleitet von org.jdom.Document, wie kann ich eine XML-Datei in DocExt laden?
Folgendes habe ich schon ausprobiert, funktioniert aber nicht:

1. (dummer) Versuch über Cast Superklasse->Subklasse, liefert ClassCastException

  SAXBuilder b = new SAXBuilder(false);
  DocExt ret = null;     	
  ret = (DocExt)b.build(xml);

  public class DocExt extends Document { ... }

2. Versuch über Konstruktor Document(java.util.List content), liefert:
org.jdom.IllegalAddException: The element "..." could not be added as the root of the document: The Content already has an existing parent document at org.jdom.ContentList.add(ContentList.java:214)

  SAXBuilder b = new SAXBuilder(false);
  DocExt ret = null;     	
  ret = new DocExt( b.build(xml).getContent() );

  public class DocExt extends Document {
    protected DocExt(List content) {
      super( content );
    }
  }

Wie geht das? Vielen Dank


----------



## Bleiglanz (31. Mrz 2005)

warum protected???

der Ansatz ist schon richtig, ich würde aber den Konstruktor mit dem Rootelement wählen, davor aber unbedingt

public Element detachRootElement()

    Detach the root Element from this document.

    Returns:
        removed root Element

aufrufen

(oder die mit getContent erhaltene Liste per setContent zum deinem eigenen Ding hinzufügen - dann werden nämlich alle parents beseitigt...)

schau mal in die API


----------



## r2k (1. Apr 2005)

Hi Bleiglanz, Danke für die Tips.



			
				Bleiglanz hat gesagt.:
			
		

> warum protected???


Die Klasse gehört zum Model einer Webapp, soll nur innerhalb des Packages erzeugt werden.



			
				Bleiglanz hat gesagt.:
			
		

> ... ich würde aber den Konstruktor mit dem Rootelement wählen, davor aber unbedingt public Element detachRootElement() ...


Meinst du so (liefert ja Compiler Fehler "Constructor call must be the first statement in a constructor"):

```
protected DocExt(List content) {
    super.detachRootElement();
    super( content );
  }
```



			
				Bleiglanz hat gesagt.:
			
		

> ... oder die mit getContent erhaltene Liste per setContent zum deinem eigenen Ding hinzufügen ...


Habe ich auch schon versucht, auch mit vorausgehendem detachRootElement() und removeContent(), liefert aber leider auch o.g. Fehler.

Vielleicht liegt der Fehler auch woanders, mal gucken, aber wo?


----------



## Bleiglanz (1. Apr 2005)

Meinst du so (liefert ja Compiler Fehler "Constructor call must be the first statement in a constructor"): 


nein anders, von aussen

nomrales doc vom SAXBuilderholen

dann das rootelement vom doc detachen

dann das rootelement in den konstruktor (MUSST DU NEU SCHREIBEN! vergiss die List!!) als argument übergeben


----------



## r2k (4. Apr 2005)

Hi Bleiglanz, hat etwas gedauert, bis ich entziffert habe, was du meinst, aber jetzt läufts. Danke.


----------

