# XML Parser Fehler, zwei gleiche kind-Elemente



## Guest (9. Jul 2007)

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,


```
<?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 

```
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 (9. Jul 2007)

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.


----------



## Guest (9. Jul 2007)

```
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 (9. Jul 2007)

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.

```
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);
      }
   }
```


----------



## Guest (9. Jul 2007)

okay wäre eine Lösung...
aber was ist wenn meine xml - Datei so aussieht.
XML

```
<?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

```
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 (9. Jul 2007)

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.


----------



## Guest (9. Jul 2007)

```
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!


```
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 (9. Jul 2007)

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:

```
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);
        }
      }
```


----------

