XML Parser Fehler, zwei gleiche kind-Elemente

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Ich hoffe ihr könnte mir helfen!

Ich möchte gern eine XML-datei Parsen, dass mache ich bis jetzt mit SAX.
Soweit so gut, funktioniert auch alles.

Hab für alle meine Werte extra Klassen und getter, setter, etc.

Nun taucht das erste Problem auf.
In der XMl - Datei gibt es verschiedene Vater-Elemente und Kind-Elemente,

Code:
<?xml version="1.0" encoding="UTF-8"?>
<Personnel>
  <anschrift>
    <plz>12345</plz>
  </anschrift>
  <fahrschule>
	<plz>10239</plz>
  </fahrschule>
</Personnel>


unter zwei verschiedenen Vater-Elementen gibt es einmal <plz> doppelt.
Dann bekomme ich sofort eine Ex. in der
Code:
public void endElement(String uri, String localName, String qName) throws SAXException {
		if(qName.equalsIgnoreCase("anschrift")) {
			//add it to the list
			myEmpls.add(tempAnschrift);			
		}else if (qName.equalsIgnoreCase("Plz")) {
			tempAnschrift.setPlz(tempVal);
		}
		
		if(qName.equalsIgnoreCase("fahrschule")) {
			//add it to the list
			myEmpls.add(tempFahrschule);			

		}else if (qName.equalsIgnoreCase("Plz")) {
			tempFahrschule.setPlz(tempVal);
		}
	}

Warum ist das so?
Ich meine der Sax holt doch Zeile für Zeile.

sobald ich das Kind-Element umbenenne, dann ist alles gut.


Was muss ich anders machen?

Danke für eure Hilfe...
 

kleiner_held

Top Contributor
Wenn du auch noch die Exception mit posten koenntest waeren wir schon mal einen Schritt weiter :)

Probleme sehe ich darin, dass du beim Parsen auf ein neues "Plz" element triffst und nicht unterscheidest, ob du dich jetzt unterhalb von 'anschrift' oder 'fahrschule' befindest, sprich im falle qName.equalsIgnoreCase("Plz") werden bei dir jeweils beide else Zweige (Zeile 6 UND Zeile 14) verarbeitet, aber nur einer kann richtig sein.
 
G

Guest

Gast
Code:
Exception in thread "main" java.lang.NullPointerException
	at prokommunal.webservice.SAXParserExample.endElement(SAXParserExample.java:183)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1241)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242)
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:255)
	at prokommunal.webservice.SAXParserExample.parseDocument(SAXParserExample.java:51)
	at prokommunal.webservice.SAXParserExample.runExample(SAXParserExample.java:38)
	at prokommunal.webservice.SAXParserExample.main(SAXParserExample.java:191)

das ist die Ex.

Ich glaub ich hab den Fehler...
Du meinst doch das durch das else if er gar nicht mehr weiß ob er in anschrift oder fahrschule ist.

Wie kann ich das dann aber machen, ohne das ich mir vorher eine Variable deklariere und ihr immer wieder das Vater Element zuweise?
 

kleiner_held

Top Contributor
Eine einfache Loesung waere es, zu schauen, ob entweder tempAnschrift oder tempFahrschule null ist. Normalerweise sollte dann nur eines von beiden null sein, am anderen setzt du die PLZ.
Code:
public void endElement(String uri, String localName, String qName) throws SAXException {
      if(qName.equalsIgnoreCase("anschrift")) {
         //add it to the list
         myEmpls.add(tempAnschrift);         
         tempAnschrift = null; // wichtig!
      }else if (qName.equalsIgnoreCase("Plz") && tempAnschrift != null) {
         tempAnschrift.setPlz(tempVal);
      }
      
      if(qName.equalsIgnoreCase("fahrschule")) {
         //add it to the list
         myEmpls.add(tempFahrschule);         
         tempFahrschule= null; // wichtig!
      }else if (qName.equalsIgnoreCase("Plz") && tempFahrschule != null) {
         tempFahrschule.setPlz(tempVal);
      }
   }
 
G

Guest

Gast
okay wäre eine Lösung...
aber was ist wenn meine xml - Datei so aussieht.
XML
Code:
<?xml version="1.0" encoding="UTF-8"?>
<Personnel>
  <anschrift>
    <strasse>Kastanienallee</strasse>
    <hnr>89</hnr>
    <ort>Berlin</ort>
    <plz>12345</plz>
  </anschrift>
  <fahrschule>
	<name_1>Fahrschule Wittig</name_1>
	<str_hausnr>Haupstraße 98</str_hausnr>
	<plz>10239</plz>
	<ort>Berlin</ort>
  </fahrschule>
</Personnel>

Quellcode
Code:
		if(qName.equalsIgnoreCase("anschrift")) {
			//add it to the list
			myEmpls.add(tempAnschrift);			
		}else if (qName.equalsIgnoreCase("Strasse")) {
			tempAnschrift.setStrasse(tempVal);
		}else if (qName.equalsIgnoreCase("Hnr")) {
			tempAnschrift.setHnr(tempVal);
		}else if (qName.equalsIgnoreCase("Ort")) {
			tempAnschrift.setOrt(tempVal);
		}else if (qName.equalsIgnoreCase("Plz")) {
			tempAnschrift.setPlz(tempVal);
		}

		if(qName.equalsIgnoreCase("fahrschule")) {
			//add it to the list
			myEmpls.add(tempFahrschule);			
		}else if (qName.equalsIgnoreCase("Name_1")) {
			tempFahrschule.setName_1(tempVal);
		}else if (qName.equalsIgnoreCase("Str_hausnr")) {
			tempFahrschule.setStr_hausnr(tempVal);
		}else if (qName.equalsIgnoreCase("Plz")) {
			tempFahrschule.setPlz(tempVal);
		}

Dann steht ja schon was drin!

Muss doch eine andere Möglichkeit geben?
 

kleiner_held

Top Contributor
Was meinst du mit "Dann steht ja schon was drin!"?

Ich sehe in da jetzt kein Problem - vor jedem tempFahrschule.setIrgendwas() musst du tempFahrschule auf null testen - bei tempAnschrift entsprechend.
 
G

Guest

Gast
Code:
		if(qName.equalsIgnoreCase("anschrift")) {
			//add it to the list
			myEmpls.add(tempAnschrift);	
			tempAnschrift= null;
		}else if (qName.equalsIgnoreCase("Strasse")) {
			tempAnschrift.setStrasse(tempVal);
		}else if (qName.equalsIgnoreCase("Hnr")) {
			tempAnschrift.setHnr(tempVal);
		}else if (qName.equalsIgnoreCase("Ort")) {
			tempAnschrift.setOrt(tempVal);
		}else if (qName.equalsIgnoreCase("Plz") && tempAnschrift != null) {
			tempAnschrift.setPlz(tempVal);
		}

		if(qName.equalsIgnoreCase("fahrschule")) {
			//add it to the list
			myEmpls.add(tempFahrschule);
			tempFahrschule= null;
		}else if (qName.equalsIgnoreCase("Name_1")) {
			tempFahrschule.setName_1(tempVal);
		}else if (qName.equalsIgnoreCase("Str_hausnr")) {
			tempFahrschule.setStr_hausnr(tempVal);
		}else if (qName.equalsIgnoreCase("Plz") && tempFahrschule != null) {
			tempFahrschule.setPlz(tempVal);
//		}else if (qName.equalsIgnoreCase("Ort")) {
//			tempFahrschule.setOrt(tempVal);
		}

so sieht jetzt aus!

Code:
Exception in thread "main" java.lang.NullPointerException
	at prokommunal.webservice.SAXParserExample.endElement(SAXParserExample.java:147)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1241)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1242)
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:255)
	at prokommunal.webservice.SAXParserExample.parseDocument(SAXParserExample.java:51)
	at prokommunal.webservice.SAXParserExample.runExample(SAXParserExample.java:38)
	at prokommunal.webservice.SAXParserExample.main(SAXParserExample.java:193)

immer noch geht es nicht!
Die Zeile 147 zeigt auf zeile 11 im code!

was nun?
 

kleiner_held

Top Contributor
Zeile 6, 8, 10: tempAnschrift auf null pruefen: && tempAnschrift != null
Zeile 20, 22: tempFahrschule auf null pruefen: && tempFahrschule != null

Das System sollte klar sein oder?

Das ganze kann man dann noch umstrukturieren alla:
Code:
     if(qName.equalsIgnoreCase("anschrift")) {
         //add it to the list
         myEmpls.add(tempAnschrift);   
         tempAnschrift= null;
      }else if (tempAnschrift != null) {
        if (qName.equalsIgnoreCase("Strasse")) {
           tempAnschrift.setStrasse(tempVal);
        }else if (qName.equalsIgnoreCase("Hnr")) {
           tempAnschrift.setHnr(tempVal);
        }else if (qName.equalsIgnoreCase("Ort")) {
           tempAnschrift.setOrt(tempVal);
        }else if (qName.equalsIgnoreCase("Plz")) {
           tempAnschrift.setPlz(tempVal);
        }
      }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm Gibt es XML-Parser-Bibliotheken XML & JSON 3
B XML-Daten mit SAX Parser verarbeiten in Java XML & JSON 4
MiMa SAX-Parser beenden? XML & JSON 5
K GSON-Parser XML & JSON 6
K XML-Parser vs. XLST XML & JSON 4
L DOM Parser Implementieren XML & JSON 9
M SAX Parser implementieren XML & JSON 2
E Gibt es denn einen XML-Parser für JUnit-Tests? XML & JSON 6
D XSD Parser XML & JSON 1
T Neuer XML Parser!!! XML & JSON 33
J XML Parser anhand xsd erzeugen XML & JSON 2
H SAX Parser optimieren XML & JSON 5
H Sax Parser verschluckt teile XML & JSON 11
C XML SAX Parser XML & JSON 10
R Handler-Wechsel, SAX Parser bricht nach 8192 Byte ab XML & JSON 5
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
S Sax Parser Performance XML & JSON 2
M Eigener XML-Parser XML & JSON 1
S Typsicherer HTML-Parser XML & JSON 5
S HTML Parser XML & JSON 2
B Parser und Fabrik XML & JSON 6
F SAX Parser siehe nichts auf dem Konsole weder eine Fehlermeldung noch eine Ergebnis XML & JSON 6
enne87 SAX-Parser XML & JSON 5
C Mit SAX Parser XML Attribute auswerten XML & JSON 3
H XML-Parser: geparste Strings in Konstruktor? XML & JSON 9
S DOM Parser XML & JSON 12
S Sax Parser XML & JSON 3
D Speicherüberlauf bei character-Methode mit SAX-Parser XML & JSON 3
Y Welchen XML Parser / Klassen aus XSD generieren lassen XML & JSON 4
H Brauche ich einen speziellen XML-Parser? XML & JSON 2
M Unhierarchisches XML-File mit DOM-Parser auswerten XML & JSON 5
S Welcher XML-Parser am besten? XML & JSON 4
S Parser XML & JSON 2
S JAVA XML Parser der einen String parst XML & JSON 3
Noar XML-Parser mit GUI? XML & JSON 2
R Problem mit SAX-Parser characters() XML & JSON 7
K SAX Parser Character Puffer zu klein XML & JSON 2
B Mit Sax-Parser validieren XML & JSON 7
Wildcard xpath Parser XML & JSON 8
T Fehler: Hauptklasse com.sun.tools.internal.xjc.XJCFacade konnte nicht gefunden oder geladen werden XML & JSON 6
T XSD/XML Fehler im Namespace? XML & JSON 1
S Apache Ant - Fehler: Hauptklasse konnte nicht gefunden oder geladen werde XML & JSON 1
B JAXB-Fehler bei REST-Api XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
A XML-Fehler beim Prefix von xmlns XML & JSON 2
A Fehler beim Erzeugen eines XML-Schema XML & JSON 4
R XML eingelesen und wieder geschrieben... Fehler XML & JSON 7
I Fehler bei XSL-FO und for-each XML & JSON 2
E Schweigsamer Fehler XML & JSON 3
G XML Fehler! Warum? XML & JSON 3
DaRolla UTF-8 Castor Unmarshal Fehler? XML & JSON 2
J Fehler beim laden einer .xml XML & JSON 3
T XML prüfen mit XSD => Alle Fehler auflisten XML & JSON 7
K XMLBuddy fehler XML & JSON 12
C Zeile herausfinden in der ein Fehler beim Einlesen entsteht XML & JSON 3
G xpath: in Kindelement zwei Attribut-Werte auslesen XML & JSON 2
F Wie bringe ich zwei xml Datein mit eine jar zum laufen? XML & JSON 4
M Zwei XML-Dateien joinen XML & JSON 3
sambalmueslie JAXB - Unmarshall ein XML-Document das aus zwei XSD Definitionen besteht XML & JSON 8
M zwei XML Streams vergleichen XML & JSON 4
C zwei xml files kombinieren XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben