XML eingelesen und wieder geschrieben... Fehler

reakky

Mitglied
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:
Java:
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:
Java:
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

Bekanntes Mitglied
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 :D
 

reakky

Mitglied
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

Bekanntes Mitglied
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

Mitglied
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

Bekanntes Mitglied
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:
Java:
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 :)
 
Zuletzt bearbeitet:

AlexSpritze

Bekanntes Mitglied
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

Bekanntes Mitglied
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).
 

Ähnliche Java Themen

Neue Themen


Oben