Problem: XML Dokument aus Textdatei erstellen

blubberblase

Mitglied
Guten Tag :)
Ich habe mal wieder eine Frage zu Java. Es geht darum: Es soll eine Textdatei eingelesen werden, die pro Zeile nur aus einem Wort besteht. Diese Zeilen sollen dann mit Hilfe von JDOM in eine XML Datei mit folgender Struktur geschrieben werden:
<words>
<zeile> </zeile>
</words>

Ich habe das kleine Programm soweit schon fertig, nur folgendes Problem: Er liest immer nur das erste Wort meiner TXT Datei ein und geht nicht weiter :/ Woran könnte das liegen?
Hier ist mein Quelltext:

Code:
	public static void createAndSaveXMLDemo (String filename){
		try{
			BufferedReader br = new BufferedReader(new FileReader("./src/words.txt"));
			String line;
			org.jdom.Document document = new org.jdom.Document ();
			org.jdom.Element words = new org.jdom.Element ("Words");
			while ((line = br.readLine())!= null) {
				words.addContent(new org.jdom.Element ("zeile").addContent(line));
				document.addContent(words);

				org.jdom.output.XMLOutputter out = new org.jdom.output.XMLOutputter();
				try{
					out.output(document, System.out);
					out.output(document, new FileOutputStream(filename));
				} catch (FileNotFoundException e){
					e.printStackTrace();		
				} catch (IOException e) {
					e.printStackTrace();
				}

				org.jdom.input.SAXBuilder builder = new org.jdom.input.SAXBuilder();
				org.jdom.Document documentClone;
				org.jdom.output.XMLOutputter prettyOut = new org.jdom.output.XMLOutputter (org.jdom.output.Format.getPrettyFormat());
				try{
					documentClone = builder.build(filename);
					prettyOut.output(documentClone, System.out);
				}catch(Exception e1){
					e1.printStackTrace();
				}
			}
                                    br.close();
		} catch (IOException e2){
			System.out.println("FEHLER");
		}
	}

Habt ihr einen Tipp was ich falsch gemacht habe? Über Tipps wäre ich sehr dankbar :)

Grüße
 
Zuletzt bearbeitet:

Xandro

- Mistkerl -
Moin,

solch ein Konstrukt habe ich aber auch noch nie gesehen, dort mit LineNumberReader ranzugehen.
Ist das so vorgegeben? Ansonsten würde ich halt den normalen BufferedReader empfehlen:

Code:
BufferedReader br = new BufferedReader(new FileReader("words.txt"));
String line;

while((line = br.readLine()) != null){
 [...]
}
br.close;

Achja, der schmeißt eine Exception also mit try-catch abfangen.

Gruß,
Xan
 

blubberblase

Mitglied
Danke für den Tipp! Es war nicht vorgegeben...das war meine Idee ;) :/ Ich bin noch nicht so fit auf diesem Gebiet, daher dieses merkwürdige Konstrukt.
Ich habe das jetzt mal durch den BufferedReader ersetzt. Allerdings komme ich zum gleichen Ergebnis. Habe ich vielleicht zu viel in der While Schleife drin? Muss irgendwas draußen stehen?

Noch mal vielen Dank! :)
 

Xandro

- Mistkerl -
Hoppla,

Du hast oben in Deinem Code-Beispiel den BufferedReader in der while-Schleife geschlossen.
Verschieb br.close() mal hinter die nächste geschweifte Klammer.
Dann sollte es nämlich eigentlich funktionieren.

Gruß,
Xan
 

blubberblase

Mitglied
Upps, stimmt :) Aber hat leider nicht geholfen :(

Jetzt kommen auch noch weitere Fehlermeldungen in meiner Eclipekonsole nach dem Ausführen:

Exception in thread "main" org.jdom.IllegalAddAxception: Cannot add a second root element, only one is allowed
...

Also irgendwas stimmt nicht beim Hinzufügen der Zeile.
 

Xandro

- Mistkerl -
Also die Exception sagt mir, dass Du halt versuchst, mehr als ein root-Element hinzuzufügen.
Vorher schien dies kein Problem gewesen zu sein, da ja immer nur die erste Zeile ausgelesen und hinzugefügt wurde.
An welcher Stelle (Zeile) tritt die Exception denn auf?

Gruß,
Xan
 

zeja

Erfahrenes Mitglied
Du mußt das
document.addContent(words);
vor der while-Schleife machen, denn dies darf nur einmal ausgeführt werden, da es nur ein root-Element geben darf.
 

blubberblase

Mitglied
@zeja: werde mal eben probieren :) Berichte gleich, ob es geht...

@Xandro: Hier ist mal die komplette Eclipse Meldung:

Code:
Exception in thread "main" org.jdom.IllegalAddException: Cannot add a second root element, only one is allowed
	at org.jdom.ContentList.documentCanContain(ContentList.java:145)
	at org.jdom.ContentList.add(ContentList.java:196)
	at org.jdom.ContentList.add(ContentList.java:131)
	at java.util.AbstractList.add(AbstractList.java:89)
	at org.jdom.Document.addContent(Document.java:319)
	at a10.WriteXML.createAndSaveXMLDemo(WriteXML.java:34)
	at a10.WriteXML.main(WriteXML.java:64)

Vor dieser Meldung zeigt er mir noch

<Words>
<zeile>der</zeile>
</Words>

an. Also nach dem ersten hinzufügen ist Schluss.

Die Methode rufe ich normal in der Main auf mit
Code:
createAndSaveXMLDemo("./src/jdom-car-001.xml");
In der XML Datei ist halt auch die erste Zeile erfolgreich reingeschrieben.

Noch mal danke für deine Hilfe! Echt nett von dir :)
 
Zuletzt bearbeitet:

blubberblase

Mitglied
@ Zeja: Wunderbar, habe das document.addContent(words) mal vor br.close() gesetzt. Nun schreibt er mit alle Zeilen in eine Datei rein. Juhu! Danke Danke! Dauert zwar recht lange bei 10.000 Zeilen, aber ich habe ja Zeit.

Eine kleine Frage ich allerdings noch. Wenn ich nun noch zusätzlich zum Zeileninhalt noch den Hashcode des Strings und die Länge mit reinschreiben möchte, was muss ich da genau machen? Ich dachte mir folgendes:

Code:
while ((line = br.readLine())!= null) {
	words.addContent(new org.jdom.Element ("zeile").addContent(line));
                words.addContent(new org.jdom.Element ("Hashcode").addContent(line.hashCode));
               words.addContent(new org.jdom.Element ("Laenge").addContent(line.length()));
               ....

Allerdings unterstreicht er mir nun in das .addContent in den zwei neuen Zeilen. Nehme mal an, dass es so einfach mit line.hashCode() und line.length() nicht geht?
 

zeja

Erfahrenes Mitglied
Ich würde das als attribute hinterlegen:

Java:
org.jdom.Element elem = new org.jdom.Element ("zeile");
elem.addContent(line);
elem.setAttribute("Hashcode",Integer.toString(line.hashCode()));
elem.setAttribute("Laenge",Integer.toString(line.length()));

words.addContent(elem);

Bei dir ging das Übrigens nicht, weil addContent einen String erwartet, hashCode und length sind aber ints. Daher muß man sie mit Integer.toString() erst noch umwandeln.