Java XML via Dom auslesen

Timmey92

Commodore
Registriert
Okt. 2008
Beiträge
4.567
Hallo,
bin gerade dabei eine XML auszulesen. Habe auch schon ein wenig Code geschrieben, komme aber nicht weiter.
XML Datei ist unten angehängt, wie komme ich an die Werte zwischen den XML Tags?

Code:
package de.tm.android.allgemeinwissen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Database {
	public void readXML(File file) {
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);

			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document dom = builder.parse(fis);
			Element root = dom.getDocumentElement();		
			NodeList rows = root.getElementsByTagName("Row");
			
			//Alle Zeilen durchlaufen
			for (int i = 0; i < rows.getLength(); i++) {
				Node row = rows.item(i);
				NodeList childNodes = row.getChildNodes();
				
				//Attribute der Zeile(Frage) auslesen
				for(int b = 0; b<childNodes.getLength(); b++)
				{
					Node attr = childNodes.item(b); //und nun?
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

XML Datei:
Code:
<table name="fragenkatalog">
	<row>
		<id>2</id>
		<category>1</category>
		<question>Wann war der Erste Weltkrieg ?</question>
		<answer1>1939 - 1945</answer1>
		<answer2>1967 - 1971</answer2>
		<answer3>1914 - 1918</answer3>
		<answer4>1889 - 1895</answer4>
		<correct_answer>3</correct_answer>
		<difficulty>1</difficulty>
	</row>
	<row>
		<id>3</id>
		<category>1</category>
		<question>Wann war der Zweite Weltkrieg ?</question>
		<answer1>1939 - 1945</answer1>
		<answer2>1967 - 1971</answer2>
		<answer3>1914 - 1918</answer3>
		<answer4>1889 - 1895</answer4>
		<correct_answer>1</correct_answer>
		<difficulty>1</difficulty>
	</row>
	<row>
		<id>4</id>
		<category>1</category>
		<question>Wann war der Dreißigjährige Krieg ?</question>
		<answer1>1618 - 1648</answer1>
		<answer2>1718 - 1748</answer2>
		<answer3>1518 - 1548</answer3>
		<answer4>1418 - 1448</answer4>
		<correct_answer>1</correct_answer>
		<difficulty>1</difficulty>
	</row>
	<row>
		<id>5</id>
		<category>3</category>
		<question>Wodurch wurde der Dreißigjährige Krieg 1648 beendet ?</question>
		<answer1>Westfälischer Frieden</answer1>
		<answer2>Bayerischer Frieden</answer2>
		<answer3>Hessischer Frieden</answer3>
		<answer4>Sächsischer Frieden</answer4>
		<correct_answer>1</correct_answer>
		<difficulty>1</difficulty>
	</row>
</table>
 
Ist es nicht schon wieder total out, das DOM durchzugehen?

Würde eher versuchen die XML-Datei als Java-Klasse zu mappen (z.B. via JAXB)
 
JAXB ist aber ein wenig komplizierter oder?
Hast du da ein paar Links zu?
Ich probiere es erst einmal mit DOM zum laufen zu kriegen ;)
 
Naja im Galileo Open Book sollte es genug Beispiele dafür geben...

Kompliziert? Wie man es nimmt... es ist meiner Meinung nach deutlich wartungsfreundlicher.
 
mein code funktioniert anscheinend nicht -.-
Er generiert keine Objekte (Funktion gibt ArrayList mit 0 Objekten zurück)
Code:
package de.tm.android.allgemeinwissen;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Database {
	public static ArrayList<Question> readXML(InputStream fis) throws Exception {
		
		ArrayList<Question> questionList = new ArrayList<Question>();
		try {
			//FileInputStream fis = new FileInputStream(file);

			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document dom = builder.parse(fis);
			Element root = dom.getDocumentElement();
			NodeList rows = root.getElementsByTagName("Row");			
			// Alle Zeilen durchlaufen
			for (int i = 0; i < rows.getLength(); i++) {
				try {

					// Frage variablen initialisieren
					int id = 0;
					int category = 0;
					String question = "";
					String answer1 = "";
					String answer2 = "";
					String answer3 = "";
					String answer4 = "";
					int correct = 0;
					int difficulty = 0;

					Node row = rows.item(i);
					NodeList childNodes = row.getChildNodes();

					// Attribute der Zeile(Frage) auslesen
					for (int b = 0; b < childNodes.getLength(); b++) {
						Node attr = childNodes.item(b);
						if (attr.getNodeName().equals("id")) {
							id = Integer.getInteger(attr.getNodeValue());
						} else if (attr.getNodeName().equals("category")) {
							category = Integer.getInteger(attr.getNodeValue());
						} else if (attr.getNodeName().equals("question")) {
							question = attr.getNodeValue();
						} else if (attr.getNodeName().equals("answer1")) {
							answer1 = attr.getNodeValue();
						} else if (attr.getNodeName().equals("answer2")) {
							answer2 = attr.getNodeValue();
						} else if (attr.getNodeName().equals("answer3")) {
							answer3 = attr.getNodeValue();
						} else if (attr.getNodeName().equals("answer4")) {
							answer4 = attr.getNodeValue();
						} else if (attr.getNodeName().equals("correct_answer")) {
							correct = Integer.getInteger(attr.getNodeValue());
						} else if (attr.getNodeName().equals("difficulty")) {
							difficulty = Integer
									.getInteger(attr.getNodeValue());
						}
					}
					
					String[] answer = {answer1,answer2,answer3,answer4};
						
					Question frage = new Question(id, question,
							answer, correct, category);
					
					questionList.add(frage);		
				} catch (Exception e) {
					// do nothing
				}
				
			}			
		} catch (Exception e) {
			throw e;
		}
		return questionList;
	}
}
 
Ich vermute mal dir gefällt die if / else if Konstruktion nicht?^^
Ich schau es mir an, aber ich möchte das andere wirklich erst zum Laufen kriegen. JAXB ist wohl auch performanter?

Achso und ich kann nur per InputStream auf die XML Datei zugreifen. Glaube nicht das JAXB nur damit zurecht kommt.
 
Zuletzt bearbeitet:
Was du glaubst ist irrelevant, schau nach. Die Antwort steht im Link, is ja wohl nicht zu viel verlangt da selbst reinzuschauen...

Und die Leistung? Spielt die eine Rolle? Selbst wenn es mit JAXB langsamer wäre, bleibt der Code wartbarer... wenn Leistung ne Rolle spielt nimmt man halt kein XML...
 
Zurück
Oben