# Java - XML - Rekursion - Verwirrung



## Honululu (27. Mai 2010)

Hallo zusammen, 

eigentlich ist die Aufgabe gar nicht schwer.. nur bin ich heute etwas verwirrt... 

folgender Code Ausschnitt liefert immer "null" zurück .. was mir klar ist, da der Rekursionsausstieg das in Verbindung mit der letzten Zeile bewirkt.. aber wie kann ich es richtig lösen (ohne globale "found" Variable):


```
private String getNodeValue(Node node, String xmlName){
	if(node.getNodeName().equals(xmlName)) 
		return node.getNodeValue();
			
	NodeList nodes = node.getChildNodes();
	for(int i=0;i<nodes.getLength();i++){
		Node sub = nodes.item(i);
		if(sub.getNodeType() != Node.ELEMENT_NODE) continue;
		return getNodeValue(sub, xmlName);		
	}
	return null;			
}
```

ich möchte eigentlich nur den Wert eines zu suchenden Tags aus einer XML Struktur zurückliefern.. 

Hoffe jemand hilft meinem verwirrten Hirn auf die sprünge.. 

LG


----------



## SlaterB (27. Mai 2010)

es kann so wie es ist durchaus schon funkionieren, die letzte Zeile muss überhaupt nicht drankommen,
sondern z.B. auf höheren Ebenen immer Zeile 9 und dann Zeile 3 wenn alles stimmt

bisher siehts aber so aus, als ob Zeile 9 immer aufs erste Element in der Liste angewandt wird, 
ganz gleich ob bei der Untersuche dieses Elementes + deren Kinder was gefunden wurde, 

wahrscheinlich kommt da null zurück, weil nicht zufällig genau das Ziel erreich wurde, 
und dann ist mit return auch gleich Schluss, die anderen Elemente der Liste haben keine Chance,

sinnvoll wäre also Zeile 9:
String x = getNodeValue(sub, xmlName);
if (x != null) {
 return x;
}
// ansonsten in der Schleife weitersuchen oder am Ende wirklich return null, Zeile 11

(oh, hoffentlich war das jetzt nicht die ganze Hausaufgabe  )


----------



## Honululu (27. Mai 2010)

Hy Slater, 
danke für deine schnelle Antwort... 

ich bin mir nicht sicher ob ich dich richtig verstanden habe.. ich denke das problem ist, wenn Zeile 3 ausgeführt wird, trotzdem noch der Rekursionsausstieg durchgeführt wird. und am Ende dann Zeile 11 ausgeführt wird.. 

was meinst du mit Zeile p ? wo soll ich das einfügen das du vorschlägst?

mfg


----------



## SlaterB (27. Mai 2010)

hab noch bisschen editiert,

ansonsten beschreibe du bitte genauer was du meinst, z.B. ein kurzer Beispiel-Baum, Suchstring und Rekursionsabfolge die du vermutest,
ich kann dir dann sagen wie es spätestens mit meiner Korrektur korrekt läuft


----------



## Honululu (27. Mai 2010)

sorry .. irgendwie bin ich zu blöd dir zu folgen  ich hab keine Ahnung wie du das meinst .. Zeile 9 ersetzen? Dann ist doch die Rekursion dahin?!?

Also was ich suche.. 
z.b. 

<xy>
  <Haus>amSee</Haus>
</xy>

Dann wäre der Funktionsaufruf 

node = obige XML Struktur
getNodeValue(node, "Haus")

und der returnwert soll "amSee" sein


----------



## SlaterB (27. Mai 2010)

> Zeile 9 ersetzen? Dann ist doch die Rekursion dahin?!?

du sollst den Code von Zeile 9, also die eine Zeile, rauswerfen und dafür paar neue bessere Code-Zeilen einfügen,
die Nummerierung ist danach gewiss hin, 
dass die Rekursion davon kaputt geht wage ich aber zu bezweifeln, hast du Argumente? 

> und der returnwert soll "amSee" sein 

eben, wird funktionieren, oder was genau geht nicht?


----------



## Honululu (27. Mai 2010)

Ups.. klar du hast Recht, die Rekusion ist nicht futsch 

Mein Fehler war, dass ich bemerkt habe das die Namensgebung der Funktion nicht gerade vorteilhaft ist, da der funktionsname im Node ebenfalls existiert und ich auch verwendet.. das hat mich gerade selbst durcheinander gebracht 

Es funktioniert .. kam zwar zuerst auch null raus, jedoch war der Fehler in Zeile 3, da hier das Ergebnis von node.getNodeValue() null ist. komischerweise muss man da glaube ich immer erst noch die childs abfragen und dann von item(0) das Value um "amSee" zu erhalten... 

danke dir Slater!!!


----------

