# DOM-Bug?



## Enigma228 (30. Sep 2006)

ich habe ein Programm geschrieben welches Xml-Datei ausliest mit StandardDomParser von Sun.
Wenn ich einen Neuen Knoten erstelle und ihn später auslesen möchte ist er zwar da hat aber keine Attribute und unterknoten. Komischerweise.. wenn ich mit XmlSerializer den Baum speichere ist alles vollständig..

neuer Knoten:

```
public void newNode(MyToDo todo, String typ){
		try{
			Element root = doc.getDocumentElement();
			Element datensatz = doc.createElement("Datensatz");
			root.appendChild(datensatz);
			Element status = doc.createElement("Status"); 
			status.setAttribute("art", typ);
			status.setAttribute("prio", todo.getPrio().toString());
			datensatz.appendChild(status);
			if(typ.equals("termin")){
				Element datum = doc.createElement("Datum");
				Text tdatum = doc.createTextNode(todo.getDatum().toString());
				datum.appendChild(tdatum);
				datensatz.appendChild(datum);
				Element uhrzeit = doc.createElement("Uhrzeit");
				Text tuhrzeit = doc.createTextNode(todo.getZeit().toString());
				uhrzeit.appendChild(tuhrzeit);
				datensatz.appendChild(uhrzeit);
			}
			Element info = doc.createElement("Info");
			Text tinfo = doc.createTextNode(todo.getInfo().toString());
			info.appendChild(tinfo);
			datensatz.appendChild(info);
		}catch(Exception e){
			e.printStackTrace();
		}
}
```
speichern:


```
public void save(){
		try{
			FileWriter fw = new FileWriter("termin.xml",false);
			OutputFormat of = new OutputFormat(doc);
			of.setIndenting(true);
			of.setEncoding("iso-8859-1");
			XMLSerializer xmlS = new XMLSerializer(fw,of);
			xmlS.serialize(doc);
			fw.close();
		}catch(Exception ex){
			System.out.println(ex.getMessage());
		}
}
```
auslesen:


```
public TreeSet<Integer> termine_in_Kalender(GregorianCalendar gc){
		nl = doc.getElementsByTagName("Datensatz");
		// Vergleichsdatum erschaffen
                int month = gc.get(Calendar.MONTH)+1;
		String myMonth, myYear;
		if(month<10){
			myMonth="0"+month;
		}else myMonth=""+month;
		myYear=""+gc.get(Calendar.YEAR);
		String date="";
		String[]array;
		TreeSet<Integer> vec= new TreeSet<Integer>();
                // hier wird jeder Datensatz ausgelesen ob er mit DatumsString übereinstimmt
		for (int i=0;i<nl.getLength();i++){
                        // wenn ich hier nicht die Abfrage hätte ob Attribute da sind
                        // (wobei ich weiss das da welche sein müssten, denn wenn ich das Programm starte wird diese
                        // Funktion ja auch aufgerufen) würde er mit nullPointer Exception reagieren, wenn er den neuen
                        // Knoten erreicht
			if(nl.item(i).getChildNodes().item(1).hasAttributes()){
				NamedNodeMap nnm=nl.item(i).getChildNodes().item(1).getAttributes();
				if(nnm.item(0).getNodeValue().equals("termin")){
	                              date=nl.item(i).getChildNodes().item(3).getChildNodes().item(0).getNodeValue().toString();
					array=date.split("\\.");
					if((myMonth.equals(array[1]))&(myYear.equals(array[2]))){
						vec.add(new Integer(Integer.parseInt(array[0])));
					}
				}
			}
		}
		return vec;
}
```


setze ich die Attribute nicht richtig?? oder wo könnte der Fehler liegen?

XML-Datei:

```
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE Termin [<!ELEMENT Termin (Datensatz)*>
<!ELEMENT Datensatz (Status,Datum?,Uhrzeit?,Info)>
<!ELEMENT Status (#PCDATA)>
<!ATTLIST Status art (termin|aufgabe) #REQUIRED>
<!ATTLIST Status pr (1|2|3) #REQUIRED>
<!ELEMENT Datum (#PCDATA)>
<!ELEMENT Uhrzeit (#PCDATA)>
<!ELEMENT Info (#PCDATA)>
]>
<Termin>
    <Datensatz>
        <Status art="termin" prio="1"/>
        <Datum>24.12.2006</Datum>
        <Uhrzeit>12:36</Uhrzeit>
        <Info>Weihnachten</Info>
    </Datensatz>
    <Datensatz>
        <Status art="aufgabe" prio="1"/>
        <Info>Mach neu</Info>
    </Datensatz>
    <Datensatz>
        <Status art="aufgabe" prio="3"/>
        <Info>Mach was ganz neues</Info>
    </Datensatz>
    <Datensatz>
        <Status art="termin" prio="1"/>
        <Datum>28.10.2006</Datum>
        <Uhrzeit>14:18</Uhrzeit>
        <Info>irgendwas tun</Info>
    </Datensatz>
    <Datensatz>
        <Status art="termin" prio="3"/>
        <Datum>28.11.2006</Datum>
        <Uhrzeit>15:27</Uhrzeit>
        <Info>test</Info>
    </Datensatz>
</Termin>
```


----------



## Roar (1. Okt 2006)

_nl.item(i).getChildNodes().item(1)_ liefert dir das Datum Element zurück, nicht das Status Element :!:


----------



## Enigma228 (2. Okt 2006)

denn ich nutze diese Funktion ja auch beim Starten des Programms bzw. und beim Wechseln des Monats im Kalender(funktion wurde extra dafür geschrieben)
er spinnt ja nur wenn ein neuer Termin dazu kommt.

Thomas


----------



## Enigma228 (2. Okt 2006)

QuellcodeAnderung:


```
public TreeSet<Integer> termine_in_Kalender(GregorianCalendar gc){
		nl = doc.getElementsByTagName("Datensatz");
		int month = gc.get(Calendar.MONTH)+1;
		String myMonth, myYear;
		if(month<10){
			myMonth="0"+month;
		}else myMonth=""+month;
		myYear=""+gc.get(Calendar.YEAR);
		String date="";
		String[]array;
		TreeSet<Integer> vec= new TreeSet<Integer>();
		System.out.println("NodeList: "+nl.getLength());
		
		for (int i=0;i<nl.getLength();i++){
			System.out.println(nl.item(i).getChildNodes().item(1).getNodeName());
			if(nl.item(i).getChildNodes().item(1).hasAttributes()){
				NamedNodeMap nnm=nl.item(i).getChildNodes().item(1).getAttributes();
				if(nnm.item(0).getNodeValue().equals("termin")){
					date=nl.item(i).getChildNodes().item(3).getChildNodes().item(0).getNodeValue().toString();
					array=date.split("\\.");
					if((myMonth.equals(array[1]))&(myYear.equals(array[2]))){
						vec.add(new Integer(Integer.parseInt(array[0])));
					}
				}
			}
		}
		return vec;
	}
```

ausgabe :
NodeList: 5
Status
Status
Status
Status
Status
NodeList: 6
Status
Status
Status
Status
Status
Datum

"Nodelist :6 "wird nach neuem Termin ausgegeben (also jetzt 6 Termine)
Nach dem Speichern (beim Beenden) und neustarten des progs ausgabe:

ausgabe:
NodeList: 6
Status
Status
Status
Status
Status
Status

hier sind es wieder alles Staten!!
liegt der Fehler ind der Funktion newNode(..) und Save-Klasse XMLSerializer korrigiert das????

Thomas


----------



## Enigma228 (3. Okt 2006)

Da sich bei Eingabe eines neuen Termins die LesePositionen im XML-Dokument ändern, lasse ich jetzt gezielt nach den Punkten suchen, statt auf festgelegte Positionen zu suchen.

Auslesen:

```
// Rückgabe der Tage(TreeSet<Integer>) an dem ein Termin ist
//(im Monat vom übergebenen GregorianCalendar gc)
public TreeSet<Integer> termine_in_Kalender(GregorianCalendar gc){
		nl = doc.getElementsByTagName("Datensatz");
		// VergleichsMonat und -Jahr werden vorbereitet
		int month = gc.get(Calendar.MONTH)+1;
		String myMonth, myYear;
		if(month<10){
			myMonth="0"+month;
		}else myMonth=""+month;
		myYear=""+gc.get(Calendar.YEAR);
		String date="";
		String[]array;
		TreeSet<Integer> vec= new TreeSet<Integer>();
		// DOM-Baum wird durchsucht und die Tage in den TreeSet eingetragen
		for (int i=0;i<nl.getLength();i++){
			if(nl.item(i).getChildNodes().item(1).hasAttributes()){
				NamedNodeMap nnm=nl.item(i).getChildNodes().item(1).getAttributes();
				if(nnm.item(0).getNodeValue().equals("termin")){
					for(int j=0;j<nl.item(i).getChildNodes().getLength();j++){
						if(nl.item(i).getChildNodes().item(j).getNodeName().equals("Datum")){
							date=nl.item(i).getChildNodes().item(j).getChildNodes().item(0).getNodeValue().toString();
							break;
						}
					}
					array=date.split("\\.");
					if((myMonth.equals(array[1]))&(myYear.equals(array[2]))){
						vec.add(new Integer(Integer.parseInt(array[0])));
					}
				}
			}
		}
		return vec;
}
```

dadurch gibt es jetzt keine Probleme mehr.

Vielen Dank für den entscheidenden Hinweis

Thomas


----------

