IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Fonction pour une liste avec XML to Linq


Sujet :

Linq

  1. #1
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut Fonction pour une liste avec XML to Linq
    Bonjour,

    J'appelle à votre aide, j'ai encore beaucoup de mal à me faire avec la syntaxe du Linq. Mon projet est de faire une dictionnaire de vidéo pour l'apprentissage du LSF (dans le style de sématos) pour mon usage perso.

    Pour faire simple, j'ai décidé de mettre mes infos dans un fichier xml.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
     
    <?xml version="1.0" encoding="utf-8"?>
    <BDD>
      <Themes>
        <Theme Id="1">
          <Libelle>
            Religion
          </Libelle>
        </Theme>
        <Theme Id="2">
          <Libelle>
            Personnage
          </Libelle>
        </Theme>
        <Theme Id="3">
          <Libelle>
            Sentiment
          </Libelle>
        </Theme>
        <Theme Id="4">
          <Libelle>
            Animal
          </Libelle>
        </Theme>
        <Theme Id="5">
          <Libelle>
            Date
          </Libelle>
        </Theme>
        <Theme Id="6">
          <Libelle>
            Civilité
          </Libelle>
        </Theme>
        <Theme Id="7">
          <Libelle>Mesure</Libelle>
        </Theme>
      </Themes>
    </BDD>
    Voici mon code qui marche bien (affichage dans un répéteur, ajout et suppression dans le fichier xml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    Partial Class GestionVideo
        Inherits System.Web.UI.Page
     
        Dim doc As XDocument = Nothing
        Dim PathBdd As String = Server.MapPath("~/Data/Bdd.xml")
     
        Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            doc = XDocument.Load(PathBdd)
            If Not Page.IsPostBack Then
                BindThemes()
            End If
        End Sub
     
    #Region "Themes"
     
        Private Sub BindThemes()
            Dim qList = From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
                                                                               {.Id = xe.Attribute("Id").Value, _
                                                                                .Libelle = xe.Element("Libelle").Value} 'Helper.GetLstTheme(doc)
            rptThemes.DataSource = qList.ToList
            rptThemes.DataBind()
        End Sub
     
        Protected Sub btnAddTheme_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles btnAddTheme.Click
            If txtId.Text.Trim.Length > 0 AndAlso txtLib.Text.Trim.Length Then
                doc = XDocument.Load(Server.MapPath("~/Data/Bdd.xml"))
     
                Dim qTargetDept As XElement = doc.Elements("BDD").FirstOrDefault
     
                Dim oEmp As New XElement("Theme")
                oEmp.Add(New XAttribute("Id", txtId.Text))
                oEmp.Add(New XElement("Libelle", txtLib.Text))
                qTargetDept.Element("Themes").Add(oEmp)
                doc.Save(PathBdd)
     
                BindThemes()
     
                txtId.Text = ""
                txtLib.Text = ""
            End If
        End Sub
     
        Protected Sub rptThemes_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles rptThemes.ItemCommand
            If e.CommandName = "DEL" Then
                Dim qEmp As XElement = doc.Descendants.Elements("Themes").Elements("Theme").Where(Function(xe) xe.Attribute("Id").Value = e.CommandArgument).FirstOrDefault()
                qEmp.Remove()
                doc.Save(PathBdd)
                BindThemes()
            End If
        End Sub
     
    #End Region
     
    End Class
    page aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="GestionVideo.aspx.vb" Inherits="GestionVideo" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <link rel="stylesheet" type="text/css" href="CSS/MaCss.css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <ajax:ToolkitScriptManager ID="ScriptManager1" runat="server">
        </ajax:ToolkitScriptManager>
        <div>
            <asp:Panel ID="pnlClick" runat="server" CssClass="pnlCSS">
                <asp:Label ID="lblMessage" runat="server" Text="Gestion des thèmes" />
                <asp:Image ID="imgArrows" runat="server" />
            </asp:Panel>
            <asp:Panel ID="pnlCollapsable" runat="server">
                <table>
                    <tr class="cpHeader">
                        <td>
                            Id
                        </td>
                        <td>
                            Libellé
                        </td>
                        <td>
                        </td>
                    </tr>
                    <asp:Repeater ID="rptThemes" runat="server">
                        <ItemTemplate>
                            <tr>
                                <td>
                                    <%# Eval("Id") %>
                                </td>
                                <td>
                                    <%# Eval("Libelle") %>
                                </td>
                                <td>
                                    <asp:ImageButton ID="btnSupp" runat="server" ImageUrl="~/Images/Poubelle.png" CommandName="DEL" CommandArgument='<%# Bind("Id") %>'/>
                                    <ajax:ConfirmButtonExtender ID="confbtn" runat="server" TargetControlID="btnSupp" ConfirmText="Etes-vous sûr de vouloir supprimer cet élément?">
                                    </ajax:ConfirmButtonExtender>
                                </td>
                            </tr>
                        </ItemTemplate>
                        <AlternatingItemTemplate>
                            <tr>
                                <td>
                                    <%# Eval("Id") %>
                                </td>
                                <td>
                                    <%# Eval("Libelle") %>
                                </td>
                                <td>
                                    <asp:ImageButton ID="btnSupp" runat="server" ImageUrl="~/Images/Poubelle.png" CommandName="DEL" CommandArgument='<%# Bind("Id") %>'/>
                                    <ajax:ConfirmButtonExtender ID="confbtn" runat="server" TargetControlID="btnSupp" ConfirmText="Etes-vous sûr de vouloir supprimer cet élément?">
                                    </ajax:ConfirmButtonExtender>
                                </td>
                            </tr>
                        </AlternatingItemTemplate>
                    </asp:Repeater>
                    <tr class="cpFooter">
                        <td>
                            <asp:TextBox ID="txtId" runat="server"></asp:TextBox>
                        </td>
                        <td>
                            <asp:TextBox ID="txtLib" runat="server"></asp:TextBox>
                        </td>
                        <td>
                            <asp:ImageButton ID="btnAddTheme" runat="server" ImageUrl="~/Images/Plus.png"  />
                        </td>
                    </tr>
                </table>
            </asp:Panel>
            <ajax:CollapsiblePanelExtender ID="CollapsiblePanelExtender1" runat="server" CollapseControlID="pnlClick"
                Collapsed="true" ExpandControlID="pnlClick" TextLabelID="lblMessage" ImageControlID="imgArrows"
                CollapsedImage="~/Images/Fleche_Bas.jpg" ExpandedImage="~/Images/Fleche_Haut.jpg"
                ExpandDirection="Vertical" TargetControlID="pnlCollapsable" ScrollContents="false">
            </ajax:CollapsiblePanelExtender>
     
        </div>
        </form>
    </body>
    </html>
    Maintenant, je souhaiterai mutualiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Dim qList = From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
                                                                               {.Id = xe.Attribute("Id").Value, _
                                                                                .Libelle = xe.Element("Libelle").Value}
    Pour pouvoir réutilser dans plusieurs listes différentes sans devoir faire de l'aborieux copier/coller

    Voici une tentative qui ne fonctionne pas (une parmi tant d'autre)
    Dans fichier de class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Imports Microsoft.VisualBasic
     
    Public Class Helper
     
        'Public Shared Function GetLstTheme(ByVal doc As XDocument) As List(Of MesClasses.Theme)
        '    Return (From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
        '                                                                       {.Id = xe.Attribute("Id").Value, _
        '                                                                        .Libelle = xe.Element("Libelle").Value}).ToList
        'End Function
    End Class
    Mesclass.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Imports Microsoft.VisualBasic
     
    Public Class MesClasses
     
     
        'Public Class Customer
        '   public int ID { get; set; 
        '       public string Forename get; set; } 
        '  public string Surname { get; set; }   
        'public string DOB { get; set; }  
        ' public string Location { get; set; }
        '   End Class
        Public Class Theme
            Public Id As Integer
            Public Libelle As String
        End Class
     
    End Class
    Merci d'avance, pour tout conseil!

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2011
    Messages : 15
    Points : 25
    Points
    25
    Par défaut
    Bonjour BROWNY,

    Tu as affiché beaucoup de code, pourrais-tu simplifier ta question?

  3. #3
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    C'est bon j'ai trouvé!!!

    En résumé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim qList = From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
                                                                               {.Id = xe.Attribute("Id").Value, _
                                                                                .Libelle = xe.Element("Libelle").Value}
    me servait à remplir un repeater. Mais j'avis besoin de la même source pour remplir un dropdownlist.

    Perso, je ne suis pas fan du copier/coller. J'aime bien des fonctions et que mon code soit bien organisé. Je suis même un peu maniac

    La solution :
    1) une classe de retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Imports Microsoft.VisualBasic
     
    Public Class MesClasses
     
        Public Class Theme
            Private _Id As Integer
            Public Property Id As Integer
                Get
                    Return _Id
                End Get
                Set(value As Integer)
                    _Id = value
                End Set
            End Property
     
            Private _Libelle As String
            Public Property Libelle As String
                Get
                    Return _Libelle
                End Get
                Set(value As String)
                    _Libelle = value
                End Set
            End Property
     
        End Class
     
    End Class
    2) une classe utilitaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Imports Microsoft.VisualBasic
     
    Public Class Helper
     
        Public Shared Function GetLstTheme(ByVal doc As XDocument) As List(Of MesClasses.Theme)
            Return (From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Order By xe.Element("Libelle").Value Select New MesClasses.Theme With {.Id = xe.Attribute("Id").Value, .Libelle = xe.Element("Libelle").Value}).ToList
        End Function
     
    End Class
    3) l'appel de n'importe où de mon projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rpt.datasource=Helper.GetLstTheme(doc)
    Comme ça, j'ai toujours en retour une liste de MesClasses.Theme, une classe que je connais très bien et que je maîtrise.

    En espérant que ce code serve aux néophites comme moi qui peuvent passer des heures pour pondre à la fin 4 lignes

    Mais je peux crier VICTOIRE!!!!!!

  4. #4
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour BROWNIE,

    Pour info tu peux remplacer cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Property Id As Integer
                Get
                    Return _Id
                End Get
                Set(value As Integer)
                    _Id = value
                End Set
            End Property
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Property Id As Integer
    et supprimer "_id" puisque tu ne l'utilise jamais pour faire de vérification.

    Par ailleurs pourquoi n'utilises-tu pas le code que je t'ai fournie dans un de tes autres thread? Beaucoup plus simple et aucun risque d'erreur (je trouve que écrire le nom des noeuds xml et des attributs est une tres mauvaise pratique, tu peux utiliser l'Intellisence, plus rapide, plus simple, aucun risque d'erreur).

    A+

  5. #5
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    Merci pour la simplification de la syntaxe..

    Pour ton exemple... je dois être un peu boulet, je ne le retrouve pas

  6. #6
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 372
    Points
    2 372
    Par défaut
    Peut etre qu'ils l'ont modifiés ou renommé alors, je vais voir si je le trouve pas chez moi, si je le trouve je te l'enverrais

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB3 Entity] Problème avec les annotations pour une List d'Enum
    Par uiscias dans le forum Java EE
    Réponses: 2
    Dernier message: 31/03/2009, 18h09
  2. Créer une fonction pour un update avec phppgadmin
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 19/06/2008, 12h56
  3. [SimpleXML] Gestion d'une liste avec xml
    Par juninho269 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 29/05/2008, 18h06
  4. Réponses: 0
    Dernier message: 10/08/2007, 22h42
  5. Réponses: 1
    Dernier message: 10/09/2006, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo