# Apache Digester - Vererbung, Abstrakte Klassen ?



## KSG9|sebastian (11. Okt 2005)

Hi Leute,

ich versuch mit Digester ein XML einzulesen und Beans zu erzeugen.
XML sieht so aus:


```
<?xml version="1.0" encoding="UFT-8"?>
<survey>
        <title>test</title>
        <description>blah blah blah</description>
        <page ID="0">
                <question required="true">
                        <text>Testfrage</text>
                        <freeAnswer/>
                </question>
                <question>
                        <text>Testfrage</text>
                        <choose>
                                <chooseText>a</chooseText>
                                <chooseText>b</chooseText>                                         </choose>
                </question>
        </page>
</survey>
```

So, wenn der Digester das Element "freeAnswer" unter survey/page/question findet, dann soll er die Klasse "TextQuestion" erzeugen. Wenn es ein Element "choose" unter dem selben Zweig gibt, dann soll er die Klasse "SelectQuestion" erzeugen. Beide Klassen erben von "Question". 

Problem ist, dass der Digester immer die Klasse "Question" initieren will. Wie kann ich dem erklären, dass er unterscheiden soll zwischen den Klassen bzw. dass er sich die richtige Klasse suchen soll ?

Gruß Sebastian


----------



## Bleiglanz (11. Okt 2005)

lies mal unter

http://www.onjava.com/pub/a/onjava/2004/12/22/jakarta-gems-1.html

es sollte irgendwie so 

dig.addObjectCreate("survey/page/question",TextQuestion.class);

gehen.

BTW:

Ich hab das früher auch mit dem Digester gemacht - bei komplexeren Schemata ist der aber doch ziemlich "verwickelt"; bin dann auf JAXB umgestiegen und kann nur sagen, dass das WESENTLICH einfacher in der Handhabung ist...(natürlich auch nicht perfekt!)


----------



## KSG9|sebastian (11. Okt 2005)

hm..ich schau mir mal JAXB an...!


```
dig.addObjectCreate("survey/page/question",TextQuestion.class);
```

Ja, damit erzeuge ich aber die Klasse TextQuestion. Ich kann im Code aber nicht unterscheiden, ob es eine TextQuestion oder ne SelectQuestion ist. Das entscheidet sich erst innerhalb des question-Elements.

Element freeAnswer: TextQuestion
Element choose: SelectQuestion


----------



## Bleiglanz (11. Okt 2005)

Hmmm, weiss gar nicht ob das geht? Digester arbeitet ja auch SAX basiert und kann also nicht "vorausschauen" - 

auch JAXB wird das nicht so machen wie du das vielleicht erwartest, weil dir das gleich das ganze Objektmodell "miterzeugt" und also nicht zwischen den verschiedenen Arten von Questions differenziert wird

warum differenzierst du nicht im xml:

<selectquestion>

und

<freetextquestion>

dann könntest du auch im einem (für JAXB notwendigen) Schema gleich erzwingen, dass eine <freetextquestion> keine <choose> enthalten kann


----------



## KSG9|sebastian (11. Okt 2005)

hm...jo..

ich glaub so mach ichs, das wird wohl die beste lösung sein..

dann kann ich auch Digester benutzen, das ist kein großer Akt mehr..

Danke und Gruß

Sebastian


----------

