[XML] Tree recursief opbouwen.

Pagina: 1
Acties:

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Goede morgen,

Hier is de probleem omschrijving.
Ik neem aan dat iedereen in staat is een boom op te bouwen met willekeurig welke programmeertaal dan ook.
Dump je data in een database, zoals hieronder, met een parent/child relatie, en haal ze eruit met een recursieve functie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
StringId | Title
---------|--------------------
A     | Root
AA   | Library
AB   | Methodology
ABA | Consulting Services
ABB | Resource Solutions
AC   | Administrator
ACA | User Management

function XMLTree(strId)
    dim strTitle, strCatId

    sql = "SELECT Title, CatId FROM TBL_Table WHERE StringId LIKE '" & strId & "_' ORDER BY StringId ASC"
    set rs = server.createobject("ADODB.recordset")
    rs.open sql, cn, 1, 2
    while not rs.EOF
        strTitle = replace(rs(0), "&", "&")
        strCatId = rs(1)
        Set oNode = oXml.createNode("element", "TreeNode", "") ' "default.asp?nodeId=" & strCatId)
        call oNode.setAttribute("NodeId", strCatId)
        call oNode.setAttribute("Text", strTitle)
        oRoot.appendChild(oNode)
        XMLTree(strCatId)
        rs.movenext
    wend
    set XMLTree = oXml
    rs.close
    set rs= nothing
end function

Voordat je deze functie aanroept, moet je natuurlijk wel zorgen dat oRoot is ge-set met oXml.documentElement. Dan weet je het root element, en kun je vanaf daar weer verder nodes aan het root element gaan hangen.

En dan het eigenlijke probleem.
Deze funtie hangt alle nodes keihard onder de root. Ik heb al geprobeerd om de root steeds opnieuw te initialiseren met de oXml.lastChild methode, maar dat mocht helaas niet baten.

Weet iemand hier hoe je de node waar je iets onder wilt hangen steeds opnieuw kunt initialiseren?

Alvast bedankt.

| Life is a game (and games are fun) | homepage |


  • Juup
  • Registratie: Februari 2000
  • Niet online
Welke taal is dit?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:08
Op maandag 24 september 2001 09:17 schreef Jaaap het volgende:
Welke taal is dit?
XML |:( en ASP

  • OJ_Simpson
  • Registratie: December 2000
  • Laatst online: 18-12-2023
Beste Paul,

waarom laat je Oompje Cees niet gewoon zelf het boek lezen? :+

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Ome Cees zal het waarschijnlijk zelf niet helemaal snappen, en dus moet ik het fixen. >:)

| Life is a game (and games are fun) | homepage |


  • OJ_Simpson
  • Registratie: December 2000
  • Laatst online: 18-12-2023
Volgens een bericht in de Computable hebben jullie nog 95 man in Boedapest zitten. Weten ze het daar niet dan? :D

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Mag ik jou vragen iets zinnigs te posten? :? ;)
Ik zou het namelijk zonde vinden als dit, door mij toch serieus bedoelde draadje dadelijk "into oblivian" gaat.

| Life is a game (and games are fun) | homepage |


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je het huidige element waarin de data moet komen meegeeft als parameter aan de recursieve functie is het probleem opgelost lijkt mij :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Dat leek mij inderdaad ook een solide oplossing, ware het niet dat het:
1. Niet werkt :'(
2. Het object moet ook ge-set worden, en dat gebeurd niet als je de huidige tak meegeeft aan de functie.

Het probleem zit 'm erin dat het object oRoot geset moet worden, omdat daarin het XML bestand wordt opgebouwd.

| Life is a game (and games are fun) | homepage |


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
akakiwi: Niet werkt :'(
Das geen reden ;) .
Het object moet ook ge-set worden, en dat gebeurd niet als je de huidige tak meegeeft aan de functie.
Ik begrijp niet exact wat je met geset bedoeld (ik werk niet in deze brabbel taaltjes ;) ) maar als je voordurend de parent meegeeft kan je je nieuwe kinderen daar gewoon aan toevoegen volgens mij (het zou in ieder geval in een W3C-DOM implementatie in elke taal kunnen).
Het probleem zit 'm erin dat het object oRoot geset moet worden, omdat daarin het XML bestand wordt opgebouwd.
Dat zou je misschien in een initiele methode kunnen doen die daarna pas de recursieve methode aanroept.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Op maandag 24 september 2001 11:12 schreef mbravenboer het volgende:

Dat zou je misschien in een initiele methode kunnen doen die daarna pas de recursieve methode aanroept.
OK, misschien ben ik niet helemaal duidelijk geweest.
Voordat je de recursieve functie aanroept, zeg ik het volgende.
code:
1
2
oXml.LoadXml "<Root/>"
set oRoot = oXml.documentElement

Hiermee wordt dus een Root element aan het object oXml toegekent, en wordt dit element aan oRoot kenbaar gemaakt.
Op dit moment ziet oRoot <Root/> dus als element waar de childs aanvast gehangen moeten worden.
Deze <Root/> is dus zowel de root, als het laatste child van de XML boom. Binnen de recusieve functie moet dus steeds het laatste child herkent worden, en moeten daaraan onderliggende nodes van de boom worden gehangen. Nu weet ik dus niet hoe je de laatste node aan oRoot kenbaar maakt, zodat daar ook Nodes onder gehangen kunnen worden.
En dat is het probleem.

:?Iets duidelijker nu:?

| Life is a game (and games are fun) | homepage |


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ja maar zoals mbravenboer al zegt moet je oNode doorgeven aan de functie als zijnde bv. oParent, en je nieuwe oNodes toevoegen als child van oParent en niet als child van oRoot.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function XMLTree(strId, oParent)
    dim strTitle, strCatId

    sql = "SELECT Title, CatId FROM TBL_Table WHERE StringId LIKE '" & strId & "_' ORDER BY StringId ASC"
    set rs = server.createobject("ADODB.recordset")
    rs.open sql, cn, 1, 2
    while not rs.EOF
        strTitle = replace(rs(0), "&", "&amp;")
        strCatId = rs(1)
        Set oNode = oXml.createNode("element", "TreeNode", "") ' "default.asp?nodeId=" & strCatId)
        call oNode.setAttribute("NodeId", strCatId)
        call oNode.setAttribute("Text", strTitle)
        oParent.appendChild(oNode)
        XMLTree(strCatId, oNode)
        rs.movenext
    wend
    set XMLTree = oXml
    rs.close
    set rs= nothing
end function

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Dikke vette obey! :)
Nou, dat werkt dus als een trein, alhoewel ik het niet logisch vind.
Want, het is toch een object waar de aanpassingen op worden gemaakt??
Misschien snap ik dat XML object dan nog niet helemaal.

iig heren, dank je wel voor de hulp.

Groeten akakiwi

| Life is a game (and games are fun) | homepage |


Verwijderd

Op dinsdag 25 september 2001 09:01 schreef akakiwi het volgende:
Dikke vette obey! :)
Nou, dat werkt dus als een trein, alhoewel ik het niet logisch vind. Want, het is toch een object waar de aanpassingen op worden gemaakt?? Misschien snap ik dat XML object dan nog niet helemaal.
Onthou maar gewoon dat een data element, wat in feite de inhoud is van een element, bv:
code:
1
2
3
<blaat>
    data
</blaat>

hier dus 'data', een childnode is van blaat, zn elementnode.
Pagina: 1