# Mehrfachvariablen in Java durch XML



## MiMa (2. Nov 2012)

Hallo,

ich habe es jetzt geschafft aus einer XML-Datei mit SAX Informationen zu entnehmen und diese dann in Instanzvariablen zu schreiben.

Soweit klappt alles ganz gut, das Problem ist, das es vorkommen kann das zu einer Variablendefinition zwei Werte enthalten sein können.

Auszug aus der XML Datei ist mit TAG 490 CODE a "490a" definiert, welches die ISBD enthält.

[XML]
<slim:datafield tag="490" ind1="0" ind2=" ">
    <slim:subfield code="a">Studium</slim:subfield>
</slim:datafield>
<slim:datafield tag="490" ind1="0" ind2=" ">
    <slim:subfield code="a">Online plus</slim:subfield>
</slim:datafield>
[/XML]

Das bedeutet die Instanzvariable ISBD enthält zwei Werte.

Die Frage ist ist jetzt wie man das in Java realisiert.
Da SAX ja immer nur Zeilenweise einliesst weiss es nicht, was noch kommen wird!

Wenn ein zweites mal datafield mit dem Attribut 490a kommt, werden die Inhalte der ersten überschrieben.

Nimmt man da Array Liste mit zwei geschachtelten Arrays für den Tag "490a" und "Studium" und durchsucht das Array am ende des XML-Dokumentes, ob es tags gibt, die mehrmals enthalten sind und arbeitet auf diese Weise?

Oder schreibt man temporäre Variablen mit einem fortlaufenden Zähler?
Variable     Inhalt
490a1        "Studium"
490a2        "Online plus"

Vielen Dank
Mi


----------



## tuxedo (2. Nov 2012)

So z.B.:

DataField --> Ein Objekt namens Datafield mit Instanzvariablen für: tag, ind1 und ind2, sowie subfield, welches von folgendem Typ ist:

Subfield --> Ein Objekt namens Subfield, mit Instanzvariablen code und "name"

Da ja mehrere DataField Tags im XML vorkommen, solltest du die beim auslesen in eine List<DataField> stecken. Fertig.

- Alex


----------



## MiMa (2. Nov 2012)

Vielen Dank,

das werde ich so mal machen.
Da ich ja noch Einsteiger bin, wird dir Rückmeldung ein bisschen dauen.

Mi


----------



## MiMa (4. Nov 2012)

Hi,

als ich das realisieren wollte, habe ich lange darüber nachgedacht.
Du hast vorgeschlagen, Objekte zu erstellen "datafieldObjekt" mit den Inhalten tag, ind1 und ind2.
Ein weiteres Objekt "subfield" mit den Inhalten code und name.

Dann würde ich folgende Objekte erhalten:

..
...
datafieldObjekt0: 490, " ", " "
subfieldObjekt0: a, Studium
datafieldObjekt1: 490, " ", " "
subfieldObjekt1: a, Online plus
...
..

Das würde aber nicht viel bringen, da ich mehrere 490 habe mit leeren ind1 und ind2.
ind1 und ind2 sind absolut unwichtig, weil dort kaum etwas sinnvolles für enthalten sind.

Das datafield+subfield gehören zusammen und ergeben den Steuercode.
Nur zusammen aus tag+code ="490a" ergibt den Inhalt ISDB

Also wäre es nicht sinnvoll nur ein Objekt zu machen?
Objekt "xmlInhaltObjekt" mit den Inhalten tag(490) code(a) name(Studium)

Dann würde ich folgende Objekte erhalten bei der Betrachtung aller benötigten Daten aus dem XML:

xmlInhaltObjekt0:  020, a, 9783834805690
xmlInhaltObjekt1:  245, a, Algorithmen kompakt und verständlich
xmlInhaltObjekt2:  245, b, Lösungsstrategien am Computer
xmlInhaltObjekt3:  245, c, Markus von Rimscha
xmlInhaltObjekt4:  250, a, 1. Aufl.
xmlInhaltObjekt5:  260, a, Wiesbaden
xmlInhaltObjekt6:  260, b, Vieweg + Teubner
xmlInhaltObjekt7:  260, c, 2008
xmlInhaltObjekt8:  300, a, VIII, 144 S.
xmlInhaltObjekt9:  300, b, Ill., graph. Darst.
xmlInhaltObjekt10: 300, c, 24 cm
xmlInhaltObjekt11; 490, a, Studium
xmlInhaltObjekt12: 490, a, Online plus
xmlInhaltObjekt13: 856, u, http://d-nb.info/989219313/04

Dabei wäre auch zu überlegen, ob ich dann nicht noch den Steuercode als eigene Variable hinzufüge die dann den Inhalt "020a", "245a", .... besitzt. Das wäre für die Prüfung vielleicht besser?

Doppelte Einträge wie die "490a" werden nur richtig erkannt wenn der code dabei ist.
Ansonsten würden 245 alles doppelte ergeben, aber keine sind, wenn der code fehlt.

Mi


----------



## MiMa (4. Nov 2012)

Hi,

so ich habe mal folgendes Umgesetzt, Auszug:


```
if ("020".equals(bufferNummer))
		{
			if ("a".equals(bufferCode))
			{
				mark21Objekt.setTag(bufferNummer);
				mark21Objekt.setCode(bufferCode);
				mark21Objekt.setInhalt(zeichenkette);
				mark21Objekt.setSteuercode(bufferNummer+bufferCode);
			} 
			else if ....
```

Ergibt folgende Ausgabe:



> Mark21 Objekt Tag:        020
> Mark21 Objekt Code:       a
> Mark21 Objekt Inhalt:     9783834805690
> Mark21 Objekt steuercode: 020a



Wobei ich weder den tag noch den code benötige und dann nur den Steuercode und den Inhalt verwende.

Die Objekte würden dann wie folgt kreiert werden:

..
...
mark21Objekt: 020a, 9783834805690
...
..

Was vollkommen ausreicht.

Allerdings habe ich folgendes Problem:


```
public class Marc21Parser
{
   Erstelle hier buchObjekt

   public void startDocument()
   public void startElement()
   public void characters(...)
   {
        Hier werden die codes Tags und Inhalte generiert
        wenn ich hier die Marc21Objekte erstelle, kommen die zwar alle in das eine buchObjekt
        aber kann nicht mehr auf die Marc21Objekte ausserhalb dieser Methode zugreifen

        Überlegung wäre, an dieser Stelle, die Inhalte dann direkt in die MySQL Datenbank zu
        schreiben ??
   }

   public void endElement(...)
   public void endDocument()
   {
         Hier könnte ich nicht mehr auf die Marc21 Objekt zugreifen
    }
}
```

Danke

Mi


----------

