# XML eingelesen und wieder geschrieben... Fehler



## reakky (28. Jul 2011)

Hallo Leute,

ich habe ein ganz komisches Problem: ich möchte eine XML-Datei einlesen und diese in ein JTable schreiben. Bevor das Programm beendet wird, soll die Datei wieder neu geschrieben werden. Soweit so gut. Es klappt eingentlich alles. Er ließt das XML ein, schreibt es in mein JTable und er schreibt es auch wieder neu, aber jetzt kommts. Starte ich das Programm nochmal, gibts ein NullPointer. Heißt er kann dann die Datei nicht mehr richtig einlesen ABER sie ist weiterhin vorhanden, und zwar *genauso *wie sie ursprünglich war. Das einzigste was mir aufgefallen ist, ist das die XML-Datei nach dem neuschreiben ca. 28 Bytes kleiner ist als vorher! Wie kann das sein das 2 gleiche XML-Dokumente unterschiedlich groß sind? Aber es sind weiterhin alle Einträge vorhanden. Hier mal der Code zum laden und einlesen der Liste:

Schreiben:

```
void writeInXml() throws ParserConfigurationException, SAXException, IOException, TransformerException{		

			dBF = DocumentBuilderFactory.newInstance();
			dB = dBF.newDocumentBuilder();

			  doc = dB.newDocument();
			  Element getRootW = doc.createElement("interpreten");
			  doc.appendChild(getRootW);
		 
		 Node getRoot = doc.getFirstChild();

		for(int i = 0; i < table.getRowCount(); i++){
			
			 Element album = doc.createElement("album");
			 getRoot.appendChild(album);
                         
			 Element title = doc.createElement("title");
			 album.appendChild(title);
			 title.appendChild(doc.createTextNode((String) table.getValueAt(i, 2)));
			 
			 Element artist = doc.createElement("artist");
			 album.appendChild(artist);
			 artist.appendChild(doc.createTextNode((String) table.getValueAt(i, 1)));
			 
			 Element track = doc.createElement("track");
			 album.appendChild(track);
			 track.appendChild(doc.createTextNode((String) table.getValueAt(i, 0)));
			 
			 Element path = doc.createElement("path");
			 album.appendChild(path);
			 path.appendChild(doc.createTextNode((String) table.getValueAt(i, 3)));
		}
		  TransformerFactory transformerFactory = TransformerFactory.newInstance();
		  Transformer transformer = transformerFactory.newTransformer();
		  DOMSource source = new DOMSource(doc);
		  StreamResult result =  new StreamResult(new File("C:/Users/David/test.xml"));
		  transformer.transform(source, result);
	}
```
Lesen:

```
void loadList(NodeList n) throws ParserConfigurationException, SAXException, IOException{
		 String xs[] = new String[4];
		 
		 int elementCounter = 0;
		 for(int i = 0; i < n.getLength(); i++){
			 NodeList a = n.item(i).getChildNodes();
			 for(int j = 1; j <= 7; j=j+2){
				 xs[elementCounter] = a.item(j).getTextContent();
				 elementCounter++;
				 
			 }
			 addItems(xs[2], xs[1], xs[0], xs[3]); 
			 elementCounter = 0;
			 
		 }
	}
```
Um Hilfe und Ratschläge wäre ich sehr dankbar 

Viele Grüße
reakky


----------



## AlexSpritze (28. Jul 2011)

Nunja, welche 28 Bytes fehlen denn zwischen den beiden Versionen der XML?

Und wenn eine NullPointerException geschmissen wird, dann kannst du doch auch herausfinden, in welcher Codezeile dies geschieht. Diese Information wäre auch für uns (potentiell) Helfende, äh .. genau, hilfreich


----------



## reakky (28. Jul 2011)

Der NullPointer kommt in *Zeile 8* bei Lesen. Habe aber jetzt eine neue Vermutung... 
Und zwar wenn ich die neue XML-Datei mit dem Editor öffne, steht alles in einer zeile, wenn ich es
von alleine angebe, dann schreibe ich es so, wie es hinterher im IE angezeigt wird. Irgendwo da muss wohl der fehler liegen...


----------



## RySa (28. Jul 2011)

Dann mach doch mal Zeilenumbrüche wenn alles in einer Zeile steht...Und lade mal am besten die original Datei und die von dir geschriebene Hoch (rapidshare oder so was), dann können wa nämlich drüber gucken


----------



## reakky (28. Jul 2011)

also ich werds jetzt erstmal so versuchen, dass ich die XML per FileWirter oder BufferedWriter schreibe, denn da kann ich dann auch Zeilenumbrüche machen. 

Der Fehler kommt definitiv daher, dass das Dokument in einer Zeile geschrieben ist. Wenn ich es nämlich selbst bearbeite und abspeichere (mit Zeilumbrüchen), dann Funktioniert es. Wenn das Programm die neue XML schreibt, ist es zwar die gleiche, aber wird ohne Umbrüche geschrieben und schon hab ich meinen NullPointer. Im IE sieht man diesen Fehler ja nicht, da die XML-Datei im XML-Format angezeit wird.

Also ich probiere es wie oben beschrieben und melde mich ggf. nochmal!
Vielen Dank schonmal...


----------



## RySa (28. Jul 2011)

dann haste auch deine 28 bytes weniger dadurch, dass die umbrüche Fehlen. Brauchst aber nicht unbedingt ein BufferedWriter für, du kannst ja so etwas der write() übergeben:

```
out.write("\n".getBytes());
```
immer da wo die Umbrüche hin müssen.

EDIT: Oops, ist ja JDom, du schreibst die Datei hier anders  Dachte du benutzst den BufferedOutputStream oder so etwas, wo du nur bytes schreiben kannst  Na dann, bau es mal um


----------



## AlexSpritze (28. Jul 2011)

Sollte das nicht eigentlich egal sein, ob die XML mit oder ohne Zeilenumbrüche geschrieben wird?
In Java könnte ich auch alles in eine einzige Zeile quetschen.

In XML sorgen doch eigentlich die Tags, also die <TAG> </TAG> Paare für eine ordnungsgemäße Gliederung der Informationen, als Mensch will man natürlich etwas Struktur sehen und macht deshalb gerne diese baumartige Struktur, die natürlich nur mit Zeilenumbrüchen entsteht. Oder sehe ich da etwas falsch?!


----------



## RySa (28. Jul 2011)

ne, das ist schon richtig. Eigentlich müsste es dem Parser egal sein, wie viele Leerstellen oder Zeilenumbrüche die XML-hat. Ich selbst hatte letztens eine Datei zu bearbeiten, die auch in einer Zeile geschrieben wurde und es ging (ich habe allerdings den SAX-Parser benutzt).


----------

