Toon posts:

[XML/VB6/Treeview] Opslaan van treeview in xml

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een echte newbie op XML-gebied.

Ik heb een treeview die ik maak door een xml-bestand in te lezen.
Ik wil het gebruiken om een userpreferences file te beheren.
Nu kan ik alle instellingen wijzigingen in de treeview, maar die wil ik dan ook opslaan in een XML-bestand.
Ik heb al wat code geprobeerd die ik gevonden heb. Maar dan krijg ik wel iets dat op een XML-bestand lijkt maar alleen parent en geen childeren.
Ik heb al de documentatie bij Microsoft door geworsteld maar dat gaat eigenlijk alleen maar over veel complexere zaken.
De code die ik gebruik heb ik ergens op dit forum gevonden.
Dit is mijn XML die ik inlees en weer wil opslaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
  <?xml version="1.0" ?> 
- <Algemeen>
- <SettingsA>
  <Naam>Hier komt een naam</Naam> 
  <Kleur>Hier komt een kleurcode</Kleur> 
  </SettingsA>
- <SettingsB>
- <SettingsBA>
  <Naam2>tekst</Naam2> 
  <Kleur2>Kleurcode</Kleur2> 
  </SettingsBA>
  </SettingsB>
  </Algemeen>

Dit is de code die ik gebruik om mijn treeview op te slaan:
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
35
36
37
Private Function pSaveXML(tv As TreeView, gXLMFile As String) As Boolean
Dim xmlDoc As New DOMDocument30
Dim oEle As IXMLDOMElement
Dim oRoot As IXMLDOMElement
Dim oNode As IXMLDOMNode
Dim oText As IXMLDOMText
Dim TNode As Node

    Set xmlDoc = New DOMDocument
    xmlDoc.resolveExternals = True
  
    ' Create processing instruction and document root
    Set oNode = xmlDoc.createProcessingInstruction("xml", "version='1.0'")
    Set oNode = xmlDoc.insertBefore(oNode, oDoc.childNodes.Item(0))

    ' Create document root
    Set oRoot = xmlDoc.createElement("Voorkeuren")
    Set xmlDoc.documentElement = oRoot
    oRoot.setAttribute "xmlns:dt", "urn:schemas-microsoft-com:datatypes"
  
   ' Add nodes:
    Dim i As Integer
    For i = 1 To tv.Nodes.Count
        Set TNode = tv.Nodes(i)
        If TNode.children = 0 Then
          Set oText = xmlDoc.createTextNode(TNode.Text)
          oRoot.appendChild oText
        Else
          Set oNode = xmlDoc.createElement(TNode.Text)
          oRoot.appendChild oNode
        End If
    Next i
    
    'Save xml file
    xmlDoc.save App.Path & "\test.xml" 'gXLMFile

End Function

Dit is dan wat voor XML er uit komt:
code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>
<Voorkeuren xmlns:dt="urn:schemas-microsoft-com:datatypes">
<Algemeen/>
<SettingsA/>
<Naam/>aangepaste naam
<Kleur/>Hier komt een kleurcode
<SettingsB/>
<SettingsBA/>
<Naam2/>tekst
<Kleur2/>Kleurcode
</Voorkeuren>

Wat mij opvalt is dat de TAGs maar 1 keer voorkomen en dat alle children parents zijn geworden.

Ik denk dat de fout zit in
code:
1
oRoot.appendChild oNode


maar ik kom er niet uit.
Kan iemand me even op weg helpen met deze elementaire doch simpele fout ;)

groeten
Paul

edit:
Gestoeid met de BBcode

[ Voor 10% gewijzigd door Verwijderd op 10-03-2004 15:13 ]


Verwijderd

Topicstarter
Dat ik geen reply krijg, betekend dat het te simpel voor woorden is en dat ik het zelf moet uitzoeken of is het wel erg ingewikkeld en weten jullie het antwoord niet?
Ik ben niet op zoek naar een pasklaar antwoord, zou wel mooi zijn overigens. ;)
Met een link of site waar het al eens uitgelegd ben ik ook al tevreden.
Ik heb zelf uiteraard al gezocht in dit forum, bij Microsoft en met Google maar zoals gezegd kom ik er dan niet uit. |:(

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
code:
1
2
3
4
5
6
7
8
9
10
11
12
   ' Add nodes:
    Dim i As Integer
    For i = 1 To tv.Nodes.Count
        Set TNode = tv.Nodes(i)
        If TNode.children = 0 Then
          Set oText = xmlDoc.createTextNode(TNode.Text)
          oRoot.appendChild oText
        Else
          Set oNode = xmlDoc.createElement(TNode.Text)
          oRoot.appendChild oNode
        End If
    Next i


Volgens mij zit hier je fout... je append al je child-objects aan het root object, terwijl deze afaik aan het parent element moeten worden gehangen... je moet de childnodes naam en kleur hangen aan de parentnodes settingsX

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Topicstarter
@FvKnijff
Bedankt. Ik zie nu waar het fout gaat. Ik gelijk gaan zoeken naar de oplossing maar ik heb tot op heden geen voorbeelden kunnen vinden waardoor het voor mij duidelijk is hoe dit op te lossen. Ik kom eigelijk steeds dezelfde voorbeelden tegen en de gebruiken recordsets. Dat lijkt me voor dit kleins een beetje overbodig, toch? :?
Als je me een voorbeeldje kunt geven dan ben ik je erg dankbaar. _/-\o_

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

kijk eens naar de volgende manier van opslaan:


oroot.Childnodes(0).appenchild(oNode)
of
oroot.Childnodes(1).appenchild(oNode)
2, 3, 4 enz

of
oroot.Childnodes(0).Childnodes(0).appenchild(oNode)
en ga nog maar ff door...

Verwijderd

Topicstarter
Ik heb weer wat geporbeerd:
[code]
Private Sub copyTreeToXML(tv As TreeView, xmlDoc As DOMDocument30, oRoot As IXMLDOMElement, startNode As Node)
Dim i As Long
Dim source As Node, dest As Node

If startNode.children = 0 Then Exit Sub

Set source = startNode.Child
For i = 1 To startNode.children
'add a node to the document
Set dest = xmlDoc.createElement(startNode.Text)
oRoot.childNodes(startNode.Index).appendChild dest
'debug:
LblDebug.Caption = LblDebug.Caption & startNode.Text & vbCrLf
'Now add all the children in a recursive manner:
Call copyTreeToXML(tv, xmlDoc, oRoot, dest)
'get a reference to the next sibling:
Set source = source.Next
Next i
End Sub
[\code]

Alleen krijg ik nu een error (type mismatch) bij:
code:
1
Set dest = xmlDoc.createElement(startNode.Text)


Ik snap het allemaal niet meer. |:(
Pagina: 1