Toon posts:

[VBscript/XMLDOM] xml-string laden in een element

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in Classic ASP met VBScript een recursieve functie, deze bouwt een menustructuur op.
Hier is de logica (niet de echte code, maar de flow is duidelijk hoop ik):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Set xmldoc = Server.CreatreObject("Microsoft.XMLDOM")

Function buildTree(id)
  Set menu = xmldoc.createElement("ul")

  For i = 0 To nMenuitems
    Set menuitem = xmldoc.createElement("li")

    Set submenu = xmldoc.createDocumentFragment()
    
    ' Nu roep ik de functie aan om een submenu voor het huidige menuitem te genereren
    strXML = buildTree(CurrentMenuItemId)

    ' Dit kan dus niet, die methode wordt niet ondersteunt
    submenu.loadXml(strXML)

    menuitem.appendChild(submenu)

    menu.appendChild(menuitem)
  Next

  buildTree = menu.xml
End Function

De functie retourneert dus een string:
XML:
1
2
3
4
<ul>
  <li></li>
  <li></li>
</ul>

Dit wil ik weer als echte xml toevoegen aan een menuitem-element. De vraag is, hoe doe ik dat? Het betreft een volledig fragment, dus documentFragment lijk mij the way to go. Maar ik weet niet hoe ik daar de xml-string in krijg.

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
je gebruikt de verkeerde methodes .. kijk bijv eens naar: http://www.4guysfromrolla.com/webtech/101600-1.2.shtml

Verwijderd

Topicstarter
Bedoel je met "verkeerde methodes" de methode createElement() versus createNode()? Want dat maakt niet uit, in het tweede geval moet je aangeven met het eerste argument wat voor type node je wil maken, met de eerste methode (die ik gebruik) maak je automatisch een element aan (dus geen attribute of comment o.i.d.).

De vraag is, als je een string met 'well-formed XML' hebt (die ik dus halverwege in strXML heb zitten), hoe kun je die aan een bestaand element toevoegen (in dit geval aan het element menuitem)? Ik probeer dat dus door in een nieuw documentFragment die xml te laden, maar dat gaat dus niet. Nu weet ik even niet hoe ik het dan aan moet pakken.

Verwijderd

Topicstarter
Ok dit werk alvast ook niet:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
strXML = buildXMLTree(CurrentMenuItemId)

'Compleet DOM document maken van het fragment
xmldoc.loadXML(strXML)

'i.p.v. een documentFragement zet ik het root element van
'bovenstaande DOM document 'over' naar submenu
Set submenu = xmldoc.documentElement

'Maar dit mag niet:
'Invalid procedure call or argument: 'menuitem.appendChild'
menuitem.appendChild(submenu)

Die foutmelding verbaast mij nogal, en ik kan het niet verklaren.

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
wat ik bedoel is dat je de handleiding niet hebt gelezen waardoor je niet weet wat documentElement betekent en ook niet wat documentFragment betekent.

om je probleem toch op te lossen heb ik hier een stukje werkende code voor je. Dit kan je gewoon opslaan als test.asp en runnen als website.
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
<%

  Dim xmldoc
  Set xmldoc = Server.CreateObject("Microsoft.XMLDOM")

  buildTree xmldoc, 1

  function buildTree(parent, level)

    response.write level

    if level < 10 then

    set myNode = xmldoc.createNode("element", "Node-" & level, "")

    parent.appendChild(myNode)

    buildTree myNode, level + 1

    end if

  end function

response.write "<br/>" 
response.write server.htmlencode(xmldoc.xml)

%>


wat je ziet is dat xmldoc steeds de elementen aanmaakt en dat ik die dan mag/kan appenden aan elke andere node die ik heb gemaakt.
Om dit koppelen in goede banen te leiden geef je de parent-node mee.

in de output zul je dan allemaal geneste nodes vinden.

happy programming B)

Verwijderd

Topicstarter
Wat toevallig, ik had net mijn code werkend gekregen, en de wijziging was een in de algehele logica, maar dus precies dezelfde die jij aanreikt. Namelijk de functie anders schrijven, met een extra argument, een documentElement. Dit betekent dus dat de functie geen return behoeft.

Ik was op het verkeerde pad, door de functie een string te laten retourneren, en deze probeerde ik dus in een fragment te krijgen.

btw, ik zit al deze tijd al op deze pagina's te snuffelen:
http://msdn.microsoft.com...036-a293-8902f3c9e5db.asp
Dat versta ik toch wel onder handleiding, maar het was de logica van het geheel die ik verkeerd had. En toch blijf ik met de vraag, als je een fragment in de vorm van een string hebt, hoe zou je dat aan een element toevoegen?

Ik heb verschillende dingen geprobeerd, maar dat is me nog steeds niet gelukt.

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
goed gevonden die msdn (8>

hier heb ik een stukje code die dus wat spul bij elkaar gooit. Het woord documentFragment betekent een stuk xml zonder 1 root-node .. hieronder gebruik ik dus geen documentFragments ..
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
31
32
33
34
<%

  Dim xmldoc
  Set xmldoc = Server.CreateObject("Microsoft.XMLDOM")

  Dim xmldoc2
  Set xmldoc2 = Server.CreateObject("Microsoft.XMLDOM")
  xmldoc2.loadxml "<root><mynode>hoi</mynode></root>"


  buildTree xmldoc, 1

  function buildTree(parent, level)

    response.write level

    if level < 10 then

    set myNode = xmldoc2.createNode("element", "Node-" & level, "")

    parent.appendChild(myNode)

    buildTree myNode, level + 1

    end if

  end function

xmldoc.childNodes(0).appendChild(xmldoc2.childNodes(0))

response.write "<br/>"
response.write server.htmlencode(xmldoc.xml)

%>


een document mag maar 1 documentElement (root) bevatten, vandaar de verschillende childNodes .. probeer maar eens te veranderen en aanschouw de errormsgs.

[ Voor 27% gewijzigd door joopst op 07-10-2005 10:57 ]

Pagina: 1