kostenloser Webspace werbefrei: lima-city


java sax xml (allg. xml)

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    szmast3r

    szmast3r hat kostenlosen Webspace.

    Hallo,

    ich habe mich in meinem Projekt entschieden eine Datenhaltung mit XML zu machen. Nur weiß ich recht wenig über XML und habe mich mit Googlen etwas rein gefunden. Grundsätzlich verstehe ich aber XML nur liegt es an dem tag/auslese">Auslesen bzw. Rein schreiben. Es gibt recht viele Beispiele die alle hilfreich sind, nur gibt es wenig Beispiele wie es mit schwierigeren XML aussieht als nur eine Person auszulesen.

    Ich habe das Problem, dass er einfach aufhört weiter auszulesen, obwohl alles stimmen sollte.. Vielleicht liegt es einfach am Montag morgen.. vielleicht könnt ihr mir etwas auf die Sprünge helfen.

    hier erstmal die XML:
    <?xml version="1.0"?>
    <schluesselliste>
    	<schluessel id="0">
    		<sc>6030</sc>
    		<scname>Rentenbeginn/Leistungsart</scname>
    		<auspraegungen>
    			<ausp>Leistungsart</ausp>
    			<von>015</von>
    			<bis>016</bis>
    			<auspbed>Altersrente fuer Frauen § 237a SGB6</auspbed>
    			<werte>
    				<wert>
    					<name>01</name>
    					<bed>Keine Ahnung</bed>
    				</wert>
    			</werte>
    		</auspraegungen>
    	</schluessel>
    </schluesselliste>


    Hier der Handler, der die XML Auslesen und die geforderten Daten Zwischenspeichern soll:
    package de.deutscherv.testtool.controller;
    
    import java.util.ArrayList;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.Locator;
    import org.xml.sax.SAXException;
    
    import de.deutscherv.testtool.model.Auspraegung;
    import de.deutscherv.testtool.model.Wert;
    import de.deutscherv.testtool.model.XMLSchluessel;
    
    public class SchluesselContentHandler implements ContentHandler{
    
    	private String aktZeile;
    	private ArrayList<XMLSchluessel> alleSchluessel = new ArrayList<XMLSchluessel>();
    	private ArrayList<Auspraegung> auspraegungen = new ArrayList<Auspraegung>();
    	private ArrayList<Wert> werte = new ArrayList<Wert>();
    	private XMLSchluessel xmlSchluessel;
    	private Auspraegung auspraegung;
    	private Wert wert;
    	
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		aktZeile = new String(ch, start, length);
    	}
    
    	@Override
    	public void endDocument() throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		
    		if(localName.equals("sc")){
    			xmlSchluessel.setnSc(aktZeile);
    			System.out.println(aktZeile);
    		}
    		
    		if(localName.equals("scname")){
    			xmlSchluessel.setSc(aktZeile);
    			System.out.println(aktZeile);
    		}
    		
    		if(localName.equals("ausp")){
    			auspraegung.setBedeutung(aktZeile);
    			System.out.println(aktZeile);
    		}
    		if(localName.equals("von")){
    			auspraegung.setVon(aktZeile);
    			System.out.println(aktZeile);
    		}
    		if(localName.equals("bis")){
    			auspraegung.setBis(aktZeile);
    			System.out.println(aktZeile);
    		}
    		if(localName.equals("auspbed")){
    			auspraegung.setBedeutung(aktZeile);
    			System.out.println(aktZeile);
    		}
    		if(localName.equals("name")){
    		wert.setName(aktZeile);
    		System.out.println(aktZeile);
    		}
    		if(localName.equals("bed")){
    			wert.setBedeutung(aktZeile);
    			System.out.println(aktZeile);
    		}
    
    				
    			werte.add(wert);
    			auspraegung.setWerte(werte);
    			auspraegungen.add(auspraegung);
    			xmlSchluessel.setAuspraegungen(auspraegungen);
    			alleSchluessel.add(xmlSchluessel);
    			System.out.println(alleSchluessel.toString());
    			
    	}
    		
    	
    
    	@Override
    	public void endPrefixMapping(String prefix) throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void ignorableWhitespace(char[] ch, int start, int length)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void processingInstruction(String target, String data)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void setDocumentLocator(Locator locator) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void skippedEntity(String name) throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void startDocument() throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes atts) throws SAXException {
    		if(localName.equals("schluessel")){
    			xmlSchluessel = new XMLSchluessel();
    			xmlSchluessel.setId(Integer.parseInt(atts.getValue("id")));
    		}
    		
    	}
    
    	@Override
    	public void startPrefixMapping(String prefix, String uri)
    			throws SAXException {
    		// TODO Auto-generated method stub
    		
    	}
    
    }


    und hier die Fehlermeldung:
    6030
    Exception in thread "main" java.lang.NullPointerException
    	at de.deutscherv.testtool.controller.SchluesselContentHandler.endElement(SchluesselContentHandler.java:76)
    	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    	at de.deutscherv.testtool.run.main.main(main.java:33)


    NullPointer kommt bei: werte.add(wert);

    Er liest also nur "SC" aus und das wars.. in die anderen If-Abfragen geht er nicht rein, weil diese komischerweise nicht zutreffen. Leider habe ich keine Ahnung wieso.. die Schreibweise ist richtig und der Aufbau ist gleich.

    Habt ihr Tipps? :/

    Danke im Vorraus!!

    Beitrag zuletzt geändert: 28.7.2014 10:52:28 von szmast3r
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mahlzeit,

    im SchluesselContentHandler-Quellcode wird die ArrayList werte schön initialisiert,
    das Objekt wert hingegen nur deklariert.
    Eine Initialisierung kann ich nirgends entdecken, es gibt also noch gar keine Objektinstanz von Wert, das ist auf jeden Fall die NullPointer Exception.

    Die Funktion endElement bekommt nur einen localName übergeben, kann also in den Bedingungen auch nur einmal zutreffen.
    Da die sc-Zeile die erste mit einem schliessenden Tag ist kommt dann schon die NullpointerException zum Tragen.

    Also einfach wert an der richtigen Stelle initialisieren und dann leer adden
    oder nur bei Bedarf mit Fallunterscheidung if(wert != null) werte.add(wert); hinzufügen.
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!