none
Problême de lecture de xml RRS feed

  • Question

  • Bonsoir à tous,

    Après maintenant 3 mois de bloquage sur mon problême, et après avoir dientifié le vrai problême, je repose un message en vous expliquant clairement ce qu'il se passe. J'ai trouvé le problême, mais je n'ai toujours pas de solution depuis maintenant 2 semaines.

    Voila le problême, j'ai un fichier xml que j'utilise pour créer une form avec ces contrôle et tout. j'ai 2 Name, Object et Property. Object définit un contrôle, et tout les property qui sont dedans sont les propriété du contrôle.

    Je vous décrie ce que fais mon code pour que vous comprenniez le problême après:
    Quand il lit le type d'un object, il donne une valeur à une variable qui dit si c'est une form, un bouton ou autre. Quand il y a un property, il donne la valeur du property au contrôle qui est en cour, et on le sais grace à la variable dont je parle juste au dessus.

    Le problême, c'est qu'il arrive que j'ai un Object, qui se trouve dans un autre Object. Le code vois un nouveau object, donc il idéntifie le type du contrôle. Mais c'est pas ce qu'il faut, car après, il ne peu plus s'occuper des Property du contrôle précédent.

    Bon, je ne suis pas sur que je vous ai bien expliqué, mais ça vous éclaircira surment si je vous donne mon code vb.net et celui en xml:

    PublicSub CONVERT(ByVal FileName AsString)
    Dim ctrl AsNew Control ' variable pour la création d'un contrôle
    Dim forms AsNew Form 'variable pour la création de la form
    Dim type_ctrl AsInteger = 0 ' 1 = Form et 2 = Contrôle
    Dim xr As XmlTextReader = New XmlTextReader(FileName)

    DoWhile xr.Read()
    SelectCase xr.NodeType
    Case XmlNodeType.Element
    SelectCase xr.Name
    Case "Object" ' Ici, on va identifier le type d'objet, un form, un boutton...ect
    SelectCase xr.GetAttribute("type")
    Case "System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ' Si cest une form
    type_ctrl = 1 '1, c'est une form
    forms = New Form
    forms.Show()
    Case "System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ' Si c'est un bouton
    type_ctrl = 2 '2, c'est un contrôle
    ctrl = New Button
    forms.Controls.Add(ctrl)
    EndSelect
    Case "Property"
    SelectCase xr.GetAttribute("name")
    Case "Text" 'Pour la propriété Text du contrôle ou de la Form
    If type_ctrl = 1 Then'Si c'est une form
    forms.Text = xr.ReadString
    EndIf
    If type_ctrl = 2 Then'Si c'est un contrôle
    ctrl.Text = xr.ReadString
    EndIf
    EndSelect
    EndSelect
    Case XmlNodeType.Element
    SelectCase xr.Name
    Case "Object"
    type_ctrl = 0
    EndSelect
    EndSelect
    Loop

    EndSub





    Et voici celui en XML:

    <Objecttype="System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"name="Dialog"children="Controls">
    <Objecttype="System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"name="Cancel_Button"children="Controls">
    <Propertyname="TabIndex">1</Property>
    <Propertyname="Size">75, 23</Property>
    <Propertyname="Name">Cancel_Button</Property>
    <Propertyname="UseVisualStyleBackColor">True</Property>
    <Propertyname="Text">Annuler</Property>
    <Propertyname="Location">313, 250</Property>
    <Propertyname="DataBindings">
    <Propertyname="DefaultDataSourceUpdateMode">OnValidation</Property>
    </Property>
    <Propertyname="DialogResult">Cancel</Property>
    </Object>
    <Objecttype="System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"name="OK_Button"children="Controls"><Propertyname="TabIndex">0</Property>
    <Propertyname="Size">75, 23</Property>
    <Propertyname="Name">OK_Button</Property>
    <Propertyname="UseVisualStyleBackColor">True</Property>
    <Propertyname="Text">OK</Property>
    <Propertyname="Location">232, 250</Property>
    <Propertyname="DataBindings">
    <Propertyname="DefaultDataSourceUpdateMode">OnValidation</Property>
    </Property>
    </Object>
    <Propertyname="ShowIcon">False</Property>
    <Propertyname="MaximizeBox">False</Property>
    <Propertyname="Text">Boite de dialogue</Property>
    <Propertyname="ShowInTaskbar">False</Property>
    <Propertyname="Name">Dialog</Property>
    <Propertyname="StartPosition">CenterScreen</Property>
    <Propertyname="DataBindings">
    <Propertyname="DefaultDataSourceUpdateMode">OnValidation</Property>
    </Property>
    <Propertyname="MinimizeBox">False</Property>
    <Propertyname="ClientSize">400, 285</Property>
    <Propertyname="FormBorderStyle">FixedDialog</Property>
    </Object>

    MERCI D'AVANCE A TOUS !!!!!!!!

    A+++++
    samedi 16 février 2008 20:12

Toutes les réponses

  • J'ai compris qu'il s'agissait d'un problème de "pile" ou de réentrance. Un objet contenu dans un objet, contenu dans un objet, etc.

    Au niveau n, l'objet est identifié par un indicateur. Ses propriétés sont affectées par rapport à cet indicateur; Un nouvel objet apparait. Bien. On passe alors au niveau n+1 et on crée un nouvel identificateur pour cet objet.

     

    Lorsque la définition de ce nouvel objet est terminée, il suffit de quiter le niveau n+1 et revenir au niveau n où l'on retrouve l'indicateur correspondant.

     

    En résumé, quand on passe au niveau suppérieur on EMPILE l'indicateur courant et on en crée un nouveau pour ce niveau. Lorsqu'on quite un niveau pour revenir au niveau inférieur, on DEPILE et on retrouve le bon indicateur.

     

    Ai-je bien compris le problème ?

    dimanche 17 février 2008 18:33
  • Oui, parfaitement comrpsi^^ Il ne reste plus qu'a trouvé une solution au problême. Enfin, on a déja une idée, mais je ne trouve pas comment y résoudre.

    A+
    dimanche 17 février 2008 20:52
  • Pouvez-vous m'envoyer par fichier séparé le code de votre procédure ainsi que votre fichier xml (celui de votre message est inutilisable) ? Je vous ferai une proposition de code pour résoudre votre problème.

    lundi 18 février 2008 19:53
  • Avec plaisir

    Voici le lien vers ce que vous m'avez demandé:
    ici


    Merci de votre aide

    mardi 19 février 2008 07:40
  •  

    WinZip signale : "archive non valide" ! impossible de l'ouvrir.
    mardi 19 février 2008 08:41
  • Oula, bizarre, bon, quand les zip ne fonctionne pas, autant faire un auto-extractible:
    ici

    J'éspère que ça fonctionne cette fois-ci.
    mardi 19 février 2008 08:48
  • Voici un code qui n'est pas complet mais qui pourra peut-être vous aider. Il utilise le principe de la récursivité (une procédure s'appelle elle-même).

    Je peux vous envoyer le projet en zip mais je ne sais pas comment faire. J'accède aux forums MSDN via mon navigateur et je ne vois pas de possibilité de joindre un fichier.

     

    Public Class MainForm

     

    Dim MyFile As String = "..\..\XMLFile1.xml"

    Dim Tab As String = " "

     

    Private Sub btLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoad.Click

    TxtBox.Text = ""

    Dim xr As XmlTextReader = New XmlTextReader(MyFile)

    xr.Read()

    If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Object" Then

    TxtBox.Text = "Object" + ControlChars.NewLine

    xr.Read()

    CodeObjet(New Form, xr)

    Else

    MsgBox("Erreur de syntaxe")

    End If

    End Sub

     

    Private Sub CodeObjet(ByVal ob As Object, ByVal xr As XmlTextReader)

    Do While True

    Select Case xr.NodeType

    Case XmlNodeType.Element

    Select Case xr.Name

    Case "Object"

    Select Case (xr.GetAttribute("type"))

    Case "System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ' Si cest une form

    TxtBox.Text += Tab + "Object : " + ControlChars.NewLine

    xr.Read()

    Tab += " "

    CodeObjet(New Form, xr)

    Tab = Tab.Remove(0, 3)

     

    Case "System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ' Si c'est un bouton

    TxtBox.Text += Tab + "Button : " + ControlChars.NewLine

    Dim b As New Button

    xr.Read()

    Tab += " "

    CodeObjet(b, xr)

    ob.Controls.Add(b)

    Tab = Tab.Remove(0, 3)

    End Select

     

    Case "Property"

    Dim s As String = xr.ReadString

    ob.Text = s

    TxtBox.Text += Tab + "Property : " + s + ControlChars.NewLine

    End Select

     

    Case XmlNodeType.EndElement

    If xr.Name = "Object" Then Exit Sub

    End Select

    ' Lecture item suivant

    xr.Read()

    Loop

    End Sub

    End Class

    mardi 19 février 2008 11:14
  • Merci beaucoups de votre aide, malheureusement, je ne sias pourquoi mais il y a une erreur durant l'éxécution. Le messagebox "Erreur de syntaxe" apparait.

    Mais, sinon, j'ai pensé, on ne pourrais pas utiliser un tableau afin de savoir  de quel contrôle il sagit?


    Merci d'avance
    mardi 19 février 2008 11:27
  • Vous avez vu que l'appli comportait un formulaire avec un TxtBox qui affiche la structure xml et un bouton pour déclencher la lecture et la traduction du fichier xml.

    Mon propos était surtout de vous montrer le principe du décodage récursif du fichier. La fonction CodeObjet prend deux arguments : l'objet parent et le flux d'entrée. Elle affecte les propriétés qu'elle décode à l'objet parent et s'appelle elle-même lorsqu'elle trouve un objet comportant lui-même des propriétés. C'est un principe simple et clair qui peut traiter n'importe quel niveaux d'objets imbriqués les uns dans les autres.

     

    Il faut certainement vérifier le fichier xml d'entrée. L'utilisation de la fonction repose sur le principe que l'objet parent est décodé AVANT l'appel de la fonction CodeObjet.

     

    Vous devrez certainement compléter la fonction CodeObjet pour éliminer les cas de malformation du fichier xml.

    Bon courage !

     

    Voici le fichier que j'ai utilisé. Il fonctionne correctement.

    <Object type="System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="Dialog" children="Controls">

    <Object type="System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="Cancel_Button" children="Controls">

    <Property name="TabIndex">1</Property>

    <Property name="Size">75, 23</Property>

    <Property name="Name">Cancel_Button</Property>

    <Property name="UseVisualStyleBackColor">True</Property>

    <Property name="Text">Annuler</Property>

    <Property name="Location">313, 250</Property>

    <Property name="DataBindings">

    <Property name="DefaultDataSourceUpdateMode">OnValidation</Property>

    </Property>

    <Property name="DialogResult">Cancel</Property>

    </Object>

    <Object type="System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="OK_Button" children="Controls">

    <Property name="TabIndex">0</Property>

    <Property name="Size">75, 23</Property>

    <Property name="Name">OK_Button</Property>

    <Property name="UseVisualStyleBackColor">True</Property>

    <Property name="Text">OK</Property>

    <Property name="Location">232, 250</Property>

    <Property name="DataBindings">

    <Property name="DefaultDataSourceUpdateMode">OnValidation</Property>

    </Property>

    </Object>

    <Property name="ShowIcon">False</Property>

    <Property name="MaximizeBox">False</Property>

    <Property name="Text">Boite de dialogue</Property>

    <Property name="ShowInTaskbar">False</Property>

    <Property name="Name">Dialog</Property>

    <Property name="StartPosition">CenterScreen</Property>

    <Property name="DataBindings">

    <Property name="DefaultDataSourceUpdateMode">OnValidation</Property>

    </Property>

    <Property name="MinimizeBox">False</Property>

    <Property name="ClientSize">400, 285</Property>

    <Property name="FormBorderStyle">FixedDialog</Property>

    </Object>

    mardi 19 février 2008 18:23
  • D'accord, je vais re regarder tout ça.

    Encore merci, je vous tiens au courrant si je m'en sort ou pas
    mardi 19 février 2008 18:33
  • Bonjour,

    Je crain que je ne m'en sorte pas encore une fois. Le bug persiste. Toujours las même erreur durant la lecture de l'xml.
    Que puis-je faire?
    Sinon, j'ai peu être une autre solution, enfin, je ne sais pas si elle est vraiment différente de celle-ci, mais bon. Elle consiste à ce que, au lieu de deviner avec quel Contrôle se raccord la propriété, on pourrais peu être lire tous les Property d'un Object avant de lire les Object qui se trouve dedans. Bon, je ne suis pas sur d'être bien claire. Mais en gros, on lit dabord les Property, et ensuite on s'attaque à l'Object suivant, et ainsi de suite.

    Voila, dite moi ce que vous en pensez s'il vous plait

    Merci
    vendredi 22 février 2008 08:24
  • Vous pouvez m'appeler au téléphone pour que nous en parlions : .

    vendredi 22 février 2008 09:52
  • Daccord, si ça vous ne derrange pas,  je vous appelerez vers 17 ou 18h. je ne pourrais pas avant. Et encore merci.
    vendredi 22 février 2008 09:55
  • Ok

     

    vendredi 22 février 2008 10:15