XML read Problem

MarioK

Aktives Mitglied
Hallo Gemeinschaft,
ich habe folgendes XML Dokument vor mir liegen :
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Knoten>
<koordinaten id="0">
<xkoord>111</xkoord>
<ykoord>222</ykoord>
</koordinaten>
<koordinaten id="1">
<xkoord>333</xkoord>
<ykoord>444</ykoord>
</koordinaten>
</Knoten>[/XML]

Erzeugt habe ich dieses damit : http://www.java-forum.org/xml-co/120551-xml-write-problem.html

Ich möchte nach dem Auslesen des XML Dokumentes eine ArrayList<Punkt> kreise erzeugt haben, die dann, wenn ich sie auslese folgenden Inhalt hat:
0(111,222)
1(333,444)

derzeit bekomme ich aber nur :
0(333,444)

mit dem folgenden Code habe ich es nicht geschafft:
Java:
import java.io.*;
import java.util.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class PunkteXMLRead {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			XMLReader rd = XMLReaderFactory.createXMLReader();
			KoordinatenHandler ch = new KoordinatenHandler();

			rd.setContentHandler(ch);
			rd.parse("data/meinePunkte.xml");
			System.out.println("Es wurden folgende Knoten generiert:");
			ArrayList<Punkt> kreise = ch.getVertices();

			for (Punkt pkt: kreise) {
				System.out.println(pkt);
			}
		}
		catch (SAXException se) {
			System.out.println("SAX-Fehler: " + se.getMessage());
		}
		catch (IOException ioe) {
			System.out.println("Datei nicht gefunden");
			ioe.printStackTrace();
		}
	}
}

class KoordinatenHandler implements ContentHandler {
	private int xkoord, ykoord; // beinhaltet die zuletzt gelesene x- / y-Koordinate
	private int id; // beinhaltet die zuletzt gelesene id
	private boolean isXkoord = false; // true g.d.w. aktuelles Element vom Typ xkoord
	private boolean isYkoord = false; // true g.d.w. aktuelles Element vom Typ ykoord

	// Array mit Knoten, die aus XML-Dokument generiert wurden
	private ArrayList<Punkt> kreise;

	public ArrayList<Punkt> getVertices() {
		return kreise;
	}


	/**
	 * Methode, die bei Elementen vom Typ xkoord / ykoord das Attribut x / y mit
	 * dem Inhalt des Elementes belegt
	 */
	public void characters(char[] ch, int start, int length) throws SAXException {

		String s = (new String(ch, start, length)).trim(); // entfernt führende oder nachfolgende Whitespaces
		if (s.length() > 0) {
			if (isXkoord) {
				xkoord = new Integer(s);
			}
			else if (isYkoord) {
				ykoord = new Integer(s);
			}
		}

	}

	public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

		if (localName.equals("koordinaten")) {
			kreise.add(new Punkt(id,xkoord,ykoord));
		}
		
	}
	
	/**
	 * Methode, die in Abhängigkeit vom Elementtyp die Klassenattribute isXkoord, isYkoord oder id belegt
	 */
	public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

		if (localName.equals("xkoord")) { // aktuelles Element vom Typ xkoord
			isXkoord = true;
			isYkoord = false;
		}
		else if (localName.equals("ykoord")) { // aktuelles Element vom Typ ykoord
			isYkoord = true;
			isXkoord = false;
		}
		else if (localName.equals("koordinaten")) {
			isYkoord = false;
			isXkoord = false;
			kreise = new ArrayList<Punkt>();
		}
		else {
			isYkoord = false;
			isXkoord = false;
			if (localName.equals("koordinaten")) { // aktuelles Element vom Typ koordinaten
				// Wert des Attributs id des Knotens holen
				if (atts.getLength() != 1) {
					System.out.println("Falsches XML-Format");
					throw new RuntimeException("Falsches XML-Format");
				}
				else {
					if (atts.getLocalName(0).equals("id")) {
						id = new Integer(atts.getValue(0));
					}
					else {
						System.out.println("Falsches XML-Format: id");
						throw new RuntimeException("Falsches XML-Format");
					}
				}
			}
		}
	}
	

	public void endDocument() throws SAXException {}
	public void endPrefixMapping(String arg0) throws SAXException {}
	public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException {}
	public void processingInstruction(String arg0, String arg1) throws SAXException {}
	public void setDocumentLocator(Locator arg0) {}
	public void skippedEntity(String arg0) throws SAXException {}
	public void startDocument() throws SAXException {}
	public void startPrefixMapping(String arg0, String arg1) throws SAXException {}
}


1. mache ich mir das mit diesem Code zu schwer???
2. wo liegt mein Denkfehler??
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Du erstellst jedes mal eine neue Liste bei dem Start-Element
Code:
koordinaten
, wieso?
Lösche mal Zeile 91
[c] kreise = new ArrayList<Punkt>();[/c]
bzw verschiebe die Instanziierung zu der Deklaration in Zeile 42
private ArrayList<Punkt> kreise = new ArrayList<Punkt>();
bzw.
private List<Punkt> kreise = new ArrayList<Punkt>();

/edit: mal eben ausprobiert und noch einen Fehler entdeckt, deine IDs passen nicht. Das liegt daran dass du den else Teil falsch gesetzt hast, der Teil muss mit in die Abfrage nach dem Element koordinaten!
Java:
		} else if (localName.equals("koordinaten")) {
			isYkoord = false;
			isXkoord = false;
			// Wert des Attributs id des Knotens holen
			if (atts.getLength() != 1) {
				System.out.println("Falsches XML-Format");
				throw new RuntimeException("Falsches XML-Format");
			} else {
				if (atts.getLocalName(0).equals("id")) {
					id = new Integer(atts.getValue(0));
				} else {
					System.out.println("Falsches XML-Format: id");
					throw new RuntimeException("Falsches XML-Format");
				}
			}
		}

und der else-Teil kann weg
 
Zuletzt bearbeitet:

MarioK

Aktives Mitglied
bevor ich zu deine Änderungen, an denen ich gerade arbeite, komme möchte ich noch kurz die Methode ins Rennen bringen, die ich vorher generiert hatte ... ist auch wesenlicher kürzer, aber es kommt immer nur null bzw Fehler einlesen bei raus. Ich suchte halt nach dem einfachen Weg, aber SAX scheint, ersteinmal in meinen Augen, doch komplexer zu sein.
Hier der Code : beachte dabei Zeile 26-30 und 61 -73 die fürs Einlesen zuständig sind
Java:
import javax.xml.bind.*;

import java.io.*;
import java.util.*;

public class PunkteXMLWrite {
		/**
		 * Methode zum Schreiben von Punkten in Datei im XML-Format
		 * @param punkteToXML die zu schreibenden Punkte
		 * @param file die Datei in die die Punkte im XML-Format geschrieben werden sollen
		 * @throws JAXBException
		 */
		public void writePunkteToXML(PunkteToXML punkteToXML, File file) throws JAXBException {
			JAXBContext jc = JAXBContext.newInstance(PunkteToXML.class);
			Marshaller m = jc.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			m.marshal(punkteToXML, file);
		}
		
		/**
		 * Methode zur Rekonstuktion von Punkten aus einer Datei im XML-Format
		 * @param file die Datei mit Punkten im XML-Format
		 * @return ein Objekt mit den in file gelesenen Adressen
		 * @throws JAXBException
		 */
		public PunkteToXML readPunkteToXML(File file) throws JAXBException {
			JAXBContext jc = JAXBContext.newInstance(PunkteToXML.class);
			Unmarshaller u = jc.createUnmarshaller();
			return (PunkteToXML) u.unmarshal(file);
		}
		/**
		 * @param args
		 */
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			PunkteXMLWrite meineDB = new PunkteXMLWrite();
			
			ArrayList<Punkt> kreise = new ArrayList<Punkt> ();
			kreise.add(new Punkt(0, 111, 222));			
			kreise.add(new Punkt(1, 333, 444));
			System.out.println(kreise);
			System.out.println();
			PunkteToXML meinePunkte = new PunkteToXML(kreise);
			
			/* Ausgabe der Liste mit Punkten */
			for (Punkt pkt: meinePunkte.getKreise()) {
				System.out.println(pkt);
			}
			
			// Generierung des XML-Dokumentes mit Punkten
			File f = new File("data/meinePunkte.xml");
			try {
				meineDB.writePunkteToXML(meinePunkte, f);
			}
			catch (Exception e) {
				System.out.println(e.getMessage());
				System.out.println("Fehler Auslesen");
			}
			
			// Rekonstruktion der Objekte aus der XML-Datei
			try {
				PunkteToXML meinePunkteNeu = meineDB.readPunkteToXML(f);
				kreise = meinePunkteNeu.getKreise();
			
				for (Punkt pkt: kreise) {
					System.out.println(pkt);
				}
			}
			catch (Exception e) {
				
				System.out.println(e.getMessage());
				System.out.println("Fehler Einlesen");
			}
		}
}
 

eRaaaa

Top Contributor
Ah ja ok, wieso du das nicht direkt mit dem Unmarshaller gemacht hast habe ich mich eh schon gefragt!
Warum das aber nicht geht, liegt daran, dass es
public void setKreise(ArrayList<Punkt> kreise) {
anstelle von
public void setListe(ArrayList<Punkt> kreise) {
in PunkteToXML heißen muss
 

MarioK

Aktives Mitglied
ich probiere halt als Newbie in Punkto XML und Java halt viele Dinge aus ...

jedenfalls ein dickes Danke an dich .... es geht jetzt beides ... SAX und JAXB .... inwieweit ich das jetzt weiter nutzen kann, werde ich sehen ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Read / write Problem beim ByteStrom XML & JSON 2
O XPATH Problem - Anfänger XML & JSON 4
so_ein_Komischer Problem mit Clean and Build XML & JSON 1
P JAXB-Problem XML & JSON 1
W Problem mit dem mit XML sortierung XML & JSON 2
S Jaxb Unmarshalling Problem XML & JSON 4
E einfaches Problem XML + XSD + jedit XML & JSON 2
S Xslt Problem XML & JSON 2
B JasperReport Problem in Runtime XML & JSON 2
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
R Problem bei: XML und XSL zu HTML XML & JSON 2
M XML write Problem zweiter Ansatz XML & JSON 3
M XML write Problem XML & JSON 2
whitenexx Problem beim parsen von Facebook XML XML & JSON 3
M XML Unicode Problem XML & JSON 2
S XJC --> Java-Objects compile Problem XML & JSON 4
F XPath-Problem mit DOM4J XML & JSON 8
B JPA + JAXB Mapping Problem XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
G Problem beim schreiben von XML in eine File XML & JSON 2
S Encoding Problem XML & JSON 7
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
B Problem beim löschen von ChildNodes aus einem XML-DOM XML & JSON 3
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
M JExcelAPI (JXL) Encoding Problem XML & JSON 11
S DOM Parsen Problem mit HTML Sonderzeichen XML & JSON 4
A aus xml --> html Problem XML & JSON 3
Y stax Problem XML & JSON 3
slawaweis Problem mit XSLT (wahrscheinlich ein Bug in Java 6) XML & JSON 16
T Problem beim Parsen von Attribut xmlns="urn:com:test&qu XML & JSON 6
P XPath Problem XML & JSON 2
J Problem beim XML-Lesen XML & JSON 2
M Problem mit FOP in Java Programm XML & JSON 2
S Problem mit XPath XML & JSON 4
J Problem mit compile einer XSD XML & JSON 3
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
A XPath Problem XML & JSON 2
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
G Problem mit XML-Schema Validierung mit Java XML & JSON 12
B jdom: getChildren() problem XML & JSON 4
H XSL-FO Problem mit If XML & JSON 2
loadbrain XPath Problem XML & JSON 2
T addContent / Problem mit Variable XML & JSON 2
F Problem mit JAXB Unmarshaller XML & JSON 2
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
8 SAXParser Problem, startElement wird nicht ausgeführt XML & JSON 2
M Java und XSLT: Performanz-Problem XML & JSON 5
X JDOM SAXBuilder Validationschema - Problem XML & JSON 8
G Problem mit getContent XML & JSON 4
K stax problem XML & JSON 2
S Problem mit SAX XML & JSON 6
A Problem mit JasperReport XML & JSON 6
G DOCTYPE Problem beim Transformer/TransformerFactory etc. XML & JSON 13
C XSD Problem XML & JSON 16
R Problem bei Erstellung von XML(JDOM) XML & JSON 3
R Problem mit SAX-Parser characters() XML & JSON 7
M XPath Problem im Zusammenhang mit document() XML & JSON 2
P Problem beim erstellen eines neuen Elements (JDOM) XML & JSON 5
Z Problem mit getNodeValue() und setNodeValue() in DOM XML & JSON 6
H JAXB CUSTOMIZATION PROBLEM XML & JSON 2
M XPATH und RSS (Problem namespaces) XML & JSON 7
P SAXParser problem? XML & JSON 2
S Problem beim Erstellen eines pdfs XML & JSON 3
V Problem mit xsd XML & JSON 2
P XML mit hilfe von JDOM abspeichern macht Problem XML & JSON 6
G Problem mit addContent() XML & JSON 4
B DTD Problem - Reihenfolge der Einträge XML & JSON 2
R Problem beim Auslesen von Attributen XML & JSON 4
K Problem mit ant/java web services XML & JSON 4
K xml Datei mit JDOM erzeugen, Problem Namespaces XML & JSON 1
P Problem mit XML und DOM XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben