Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

treeview to xml

8 réponses
Avatar
tking
Bonjour,

j'ai trouvé un code en C++ que j'aimerais adapter en vb, mais j'ai
beaucoup de difficultés avec treeview.

Si quelqu'un peut m'aider.

Voici le code

=============================================

private static void parseNode(TreeNode tn)
{
IEnumerator ie = tn.Nodes.GetEnumerator();

string parentnode = "";

parentnode = tn.Text;

while (ie.MoveNext())
{
TreeNode ctn = (TreeNode) ie.Current;

if (ctn.GetNodeCount(true) == 0)
{
sr.Write(ctn.Text);
}
else
{
sr.Write("<" + ctn.Text + ">");
}
if (ctn.GetNodeCount(true) > 0)
{
parseNode(ctn);
}
}

sr.Write("</" + parentnode + ">");
sr.WriteLine("");
}

================================================

Je ne sais pas à quoi correspond "IEnumerator ie", je galère.

Merci pour le coup de main.

8 réponses

Avatar
François Picalausa
On Sep 30, 3:41 pm, tking wrote:
Bonjour,

j'ai trouvé un code en C++ que j'aimerais adapter en vb, mais j'ai
beaucoup de difficultés avec treeview.

<snip>

Je ne sais pas à quoi correspond "IEnumerator ie", je galère.



Hello,

Pour ce que j'en dis, ça ressemble nettement plus à du C# qu'à du C++,
même s'il est possible d'écrire le même code en C++.

IEnumerator correspond au type IEnumVariant de COM, très employé sous
Visual Basic 6 dans les... For Each.
En VB6, la traduction de ce code serait donc, à peu près:
Private Function WriteText(Text As String) As Boolean
Debug.Print Text
WriteText = True
End Function

Private Sub parseNode(tn As Node)
Dim ctn As Node
Dim ParentNode As String
ParentNode = tn.Text

Set ctn = tn.Child
Do While Not ctn Is Nothing
'Remarque : dans ctn.GetNodeCount(true), false
'serait plus approprié
If ctn.Children = 0 Then
WriteText ctn.Text
Else
WriteText "<" & ctn.Text & ">"
End If

If ctn.Children > 0 Then
parseNode ctn
End If

Set ctn = ctn.Next
Loop

WriteText "</" & ParentNode & ">" & vbCrLf
End Sub

Cela étant, ce code est faux et ne fera pas ce qu'il est sencé faire
(tout le ferait - si je l'ai bien compris - le code original).
Pour diverses raisons, il serait plus adéquat de définir le code
différemment de sorte à produire un output plus facilement lisible,
plus extensible et surtout compatible xml.
Voici un exemple de code dans cette optique:
Private Function XmlEscapestring(Text As String) As String
XmlEscapestring = Text
XmlEscapestring = Replace(XmlEscapestring, "&", "&amp;")
XmlEscapestring = Replace(XmlEscapestring, "<", "&lt;")
XmlEscapestring = Replace(XmlEscapestring, ">", "&gt;")
End Function

Private Sub NodeToXml(BaseNode As Node, Optional Recurse As Boolean =
True, Optional PerformDeclaration As Boolean = True, Optional Encoding
As String)
Dim ChildNode As Node

If (Not BaseNode Is Nothing) Then
'Ajoute la déclaration XML
If PerformDeclaration Then
If LenB(Encoding) = 0 Then
WriteText "<?xml version=""1.0""?>"
Else
WriteText "<?xml version=""1.0"" encoding=""" &
Encoding & """?>"
End If
End If

WriteText "<treenode value=""" &
XmlEscapestring(BaseNode.Text) & """ key=""" &
XmlEscapestring(BaseNode.Key) & """"

If ((Not Recurse) Or (BaseNode.Children = 0)) Then
WriteText "/>"
Else
WriteText ">"

Set ChildNode = BaseNode.Child

While Not ChildNode Is Nothing
NodeToXml ChildNode, True, False, vbNullString
Set ChildNode = ChildNode.Next
Wend

WriteText "</treenode>"
End If
End If
End Sub

Private Function WriteText(Text As String) As Boolean
'Penser à encoder correctement le fichier
Debug.Print Text
WriteText = True
End Function

Naturellement, c'est se priver de la facilité que fournissent les
librairies spécialisées, telles que Microsoft Xml (notamment, il
faudrait penser, par défaut, à encoder en UTF-8 le texte en sortie
vers le fichier).

François Picalausa
Avatar
tking
François Picalausa avait énoncé :

(code)

François Picalausa



Merci beaucoup pour cette réponse detaillée, parfait pour moi.

Bonne soirée.
Avatar
tking
François Picalausa a couché sur son écran :


Private Sub NodeToXml(BaseNode As Node, Optional Recurse As Boolean > True, Optional PerformDeclaration As Boolean = True, Optional Encoding
As String)




Je n'arrive pas à appeler la fonction. Comme faire passer mon treeview
dans un basenode ?

Encore merci.
Avatar
tking
Ok, j'ai pigé, dur dur.

Le resultat avec fonction "parseNode" est très proche de ce que je
cherche :)

A+
Avatar
François Picalausa
On Sep 30, 8:16 pm, tking wrote:
Ok, j'ai pigé, dur dur.

Le resultat avec fonction "parseNode" est très proche de ce que je
cherche :)

A+



Hello,

Aucune des deux n'est prévue pour exporter directement le treeview
(même si en réalité, il suffit d'ajouter un noeud parent au XML pour
contenir chacun des enfants).

Voici une méthode d'export du treeview (ajoutant ce noeud parent) avec
l'aide de Microsoft XML (les versions 2 à 6 sont OK):
Public Function TreeToXml(tvw As TreeView) As DOMDocument
Dim Result As DOMDocument
Dim XmlRoot As IXMLDOMElement

'Construit le document et lui ajoute un noeud de base
'nommé "treeview"
Set Result = New DOMDocument

Set XmlRoot = Result.createElement("treeview")
Result.appendChild XmlRoot

'Construit la liste des enfants et l'ajoute au noeud de base
AddNodeToXml TreeView1.Nodes(1), Result, XmlRoot


Set TreeToXml = Result
End Function

'-------------------------------------------------------------------------- -------------
' Procedure : AddNodeToXml
' DateTime : 9/30/2007 22:12
' Purpose : Ajoute au noeud Parent des noeuds décrivant chacun des
noeuds du niveau
' du noeud n, à partir de n
'-------------------------------------------------------------------------- -------------
'
Public Function AddNodeToXml(n As Node, doc As DOMDocument, Parent As
IXMLDOMElement)
Dim Result As DOMDocument
Dim XmlElement As IXMLDOMElement

'pour chaque frère de n (et n)
While (Not n Is Nothing)
'Crée un élément décrivant le noeud
Set XmlElement = doc.createElement("treenode")
XmlElement.setAttribute "text", n.Text
'construit les noeuds enfants
AddNodeToXml n.Child, doc, XmlElement
'ajoute le noeud au parent
Parent.appendChild XmlElement

'passe au frère suivant
Set n = n.Next
Wend
End Function

Exemple d'utilisation:
TreeToXml(TreeView1).save "c:toto.xml"
MsgBox TreeToXml(TreeView1).xml

L'avantage d'employer un parser xml non intégré est que tout ce qui
est complications d'encodage et de générer de l'xml valide n'est pas à
réaliser dans l'application elle même. De même, le décodage peut être
fait par MSXML.

François Picalausa
Avatar
tking
Dans son message précédent, François Picalausa a écrit :

Hello,

Aucune des deux n'est prévue pour exporter directement le treeview
(même si en réalité, il suffit d'ajouter un noeud parent au XML pour
contenir chacun des enfants).



Voici une méthode d'export du treeview (ajoutant ce noeud parent) avec
l'aide de Microsoft XML (les versions 2 à 6 sont OK):


(code)
François Picalausa



Yes, mais j'étais à la recherche de quelque chose de facilement
adaptable à un PDA (Windows Mobile), du coup est-ce que Microsoft XML
va fonctionner sur un PDA ? J'ai rien trouvé à ce sujet sur Google.

Bonne soirée.
Avatar
François Picalausa
On Oct 1, 9:31 pm, tking wrote:
Dans son message précédent, François Picalausa a écrit :

> Hello,

> Voici une méthode d'export du treeview (ajoutant ce noeud parent) avec
> l'aide de Microsoft XML (les versions 2 à 6 sont OK):
(code)

Yes, mais j'étais à la recherche de quelque chose de facilement
adaptable à un PDA (Windows Mobile), du coup est-ce que Microsoft XML
va fonctionner sur un PDA ? J'ai rien trouvé à ce sujet sur Google.

Bonne soirée.



Hello,

Je ne sais pas si MSXML fonctionne sur PDA, mais néanoins je pense que
tu devrais pouvoir te débrouiller pour "faire sans" en combinant
"NodeToXml" et "TreeToXml". Il y a assez peu de code à ajouter,
NodeToXml présentant les méthodes de sérialization vers xml
directement et TreeToXml présentant le parcours entier de l'arbre.
Il s'agit simplement de déplacer l'écriture de l'en-tête (<?xml ... ?)
avant la déclaration de l'arbre, d'ajouter un noeud d'en tête
(correspondant à Result.createElement("treeview")), et ensuite
d'appeler NodeToXml pour chacun des noeuds de tête de l'arbre (par
exemple).
Je te conseille d'exécuter une fois ou deux le code en pas à pas pour
être sûr de comprendre le fonctionnement des procédures proposées.
Dans tout les cas, je reste bien entendu à disposition !

François
Avatar
tking
François Picalausa a présenté l'énoncé suivant :

Je te conseille d'exécuter une fois ou deux le code en pas à pas pour
être sûr de comprendre le fonctionnement des procédures proposées.
Dans tout les cas, je reste bien entendu à disposition !

François




C'est très aimable, c'est fou le temps que l'on peut gagner avec de
l'aide. J'y retourne :)