Søge DOM træ efter node hvor sub-sub node == x

Tags:    java

Jeg er igang med at lave en IRC bot. Folk skal kunne logge ind med deres nick og et password. Brugerene bliver gemt i en XML fil der ser således ud:
Fold kodeboks ind/udKode 


Jeg bruger DOM til at håntere XML filen.

Jeg vil gerne kunne få fat i et "user" element, hvor nick elementets child element(det der står mellem de 2 nick tags) er == [noget jeg vælger]. Altså, finde en bruger/("user") ved at kende brugerens nick.

Jeg er kommet frem til følgende funktion(er godt klar over at den ikke virker, og kan til dels også godt se hvorfor)

Fold kodeboks ind/udJava kode 


Denne funtion rejser træet igennem, og leder efter et "nick" tag, vis indhold(childnode) er = en text streng.

Det problem, som jeg godt selv kan se er at vis den når en leaf-node og den ikke har fundet det den ledte efter, retunere den bare null. Jeg vil først have den til at retunere null når den har søgt ALLE leafnodes igennem, og stadig ikke har fundet hvad den ledte efter.

Men så vidt jeg kan se, burde den da retunere den rigte bruger, vis brugeren tilfældigvis skulle være den allerførste bruger i XML filen. Det gør den heller ikke.

Er der nogle der ved hvad jeg har gjort galt, eller kender en anden, bedre måde at søge i et træ?

Har desværre stadig ingen UP :(, måske ville det være en ide at lave spørgsmål med 0 UP tilladt, så man ikke behøver at oprette en kommentar vis man ikke har nogle.



Indlæg senest redigeret d. 21.06.2009 15:09 af Bruger #13669
Kan ikke helt se det lige nu. Prøv at lave udskrivninger (System.out.writeln) på alle værdier du henter også på og se om det opfører sig som forventet.

Kan godt være jeg tager fejl men kan du godt returne i en for statement?

Fold kodeboks ind/udKode 


Vil den ikke bare returne kun den første gang?



Vil den ikke bare returne kun den første gang?


Jo, det er det der er problemt. Så det jeg spørger om, er i virkeligheden bare hvordan man søger i et træ. Den kode jeg postede, var bare det jeg havde forsøgt mig med. Er godt klar over at det ikke virker :D



Vil den ikke bare returne kun den første gang?


Jo, det er det der er problemt. Så det jeg spørger om, er i virkeligheden bare hvordan man søger i et træ. Den kode jeg postede, var bare det jeg havde forsøgt mig med. Er godt klar over at det ikke virker :D


Siden der højst sandsynligt kun findes en med det givne nick, eller ingen, vil dette være bedre. Her returnerer du kun hvis du finder en og returnere ikke null. Hvis du ikke finder en tager din return længere nede sig af det.:

Fold kodeboks ind/udKode 


Den form for søgning du ønsker her er "depth-first" search. Du går fra roden ned til rødderne, op til dens rod og ned igen indtil du har alle dens rødder. Så går du op igen og vælger dens rødder osv..

Se her tallene er rækkefølgen man tager. Men husk du skal kun ned til et vist niveau, tekstnoden.
http://en.wikipedia.org/wiki/Depth-first



Indlæg senest redigeret d. 21.06.2009 15:57 af Bruger #14645
Mange tak for svaret :D jeg vil se om jeg kan få det til at virke.



Det grundlæggende bag rekursiv søgning i træer er:

- Hvis der er mere der skal søges, så kalder du return på funktionen igen med nyt argument.

- Hvis du ikke finder det du leder efter så returnerer null, og fordi du gør det rekursivt bliver denne returværdi passet op til det allerførste kald.

- Hvis du finder det du leder efter så returnerer du det og det bliver så "smidt op" og bliver returværdien for det allerførste kald.



Hvis jeg var dig ville jeg gøre det sådan her:

Lave en funktion der giver dig en liste (sekvens) med alle 'user' nodes.

Lave en funktion der tager en 'user node' og giver en teksten fra en 'nick node'.

Itererer over listen og hvis strengen matcher 'nicket' så returner denne, ellers returner null.

Årsagen er at jeg ikke synes et imperativt sprog som Java er det rette til at lave ordentlig funktionorienteret (herunder rekursive funktionskald) programmering. Dens objektive fremgangsmåde syntes jeg også modvirker lidt det rekursive.




Indlæg senest redigeret d. 21.06.2009 16:35 af Bruger #14645
t