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

C# Discussion :

Modifier un enregistrement XML avec LINQ to XML


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Par défaut Modifier un enregistrement XML avec LINQ to XML
    Bonsoir,

    J'ai le petit soucis suivant: je cherche à modifier un enregistrement dans un de mes fichiers XML. Je suis sûr qu'il s'agit d'un petit truc que je fais faux, mais je n'arrive pas à trouver comment corriger la choses.

    Voici le code:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void EditProject(string oldProjectName, string newProjectName)
            {
                XDocument xmlFile = XDocument.Load(@"./../../Data/" + Program.__ProjectsXMLFile);
     
                XElement XMLParent = xmlFile.Root;
     
                var parents = (from nodes in XMLParent.Elements() where XMLParent.Elements().Equals(oldProjectName) select nodes).SingleOrDefault();
     
                parents.SetValue(newProjectName);
     
                xmlFile.Save(@"./../../Data/" + Program.__ProjectsXMLFile);
     
            }

    Le fichier XML ressemble à ceci:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="utf-8"?>
    <projects>
      <item id="0">Pif</item>
      <item id="1">Paf</item>
      <item id="2">Pouf</item>
      <item id="3">tutu</item>
    </projects>

    Je pense que l'erreur doit être dans la requête LINQ to XML car je reçois une erreur du type object not set to an instance...

    Quelqu'un voit ou est l'erreur?

    Merci bien et bonne soirée : )

    L.

  2. #2
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    J'ai pas testé le code mais à vu de nez, c'est ta variable "parents" qui vaut null.

    Tu fais un equals entre un string et un IEnumerable<XElement> il y a peu de chances que ça renvoie true, par conséquent tu ne récupères rien de ta requête et la valeur par défaut est alors utilisée (SingleOrDefault) pour renvoyer une valeur (soit null pour un objet de type XElement).
    Par la suite tu cherches à utiliser une méthode de cet objet ce qui lève l'exception.

    (Note au passage, il me semble que tu aurais plutôt dû utiliser nodes en lieu et place de XMLParent.Elements() pour ton Equals même si le résultat aurait été le même je suppose)

    En remplacement je ferais ceci (non testé donc à vérifier)
    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
     
    public static void EditProject(string oldProjectName, string newProjectName)
    {
        XDocument xmlFile = XDocument.Load(@"./../../Data/" + Program.__ProjectsXMLFile);
     
        XElement project = xmlFile.Root.SingleOrDefault(xe => xe.Value == oldProjectName);
     
        if (project != null)
        {
            project.SetValue(newProjectName);
            xmlFile.Save(@"./../../Data/" + Program.__ProjectsXMLFile);
        }
        else
            // ici gérer le cas project non trouvé au besoin
     
    }
    Un autre point, Single[OrDefault] peut lever une InvalidOperationException si jamais plus d'un résultat concordant est trouvé, comme j'ignore si c'est une possibilité je préfère le préciser

    Cordialement !

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Par défaut
    Arg les expressions lambda ^^ (est-ce que tu as un lien qui explique comment ça marche dailleurs? Car à chaque fois que je les vois je les évites...)

    Je vais tester tout ça demain

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Leelith Voir le message
    Arg les expressions lambda ^^ (est-ce que tu as un lien qui explique comment ça marche dailleurs? Car à chaque fois que je les vois je les évites...)
    Si tu les évites tu vas jamais comprendre comment ça marche... faut pas se laisser effrayer par le nom .

    D'ailleurs tu les utilises sans le savoir à chaque fois que tu écris une requête Linq. Par exemple, cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var query =
        from x in list
        where x.Foo == 42
        select x.Bar;
    (en supposant que list est de type List<MyClass> par exemple)

    Correspond en fait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var query = list.Where(x => x.Foo == 42).Select(x => x.Bar);
    Ca n'a rien de compliqué, c'est juste une fonction anonyme. Tu pourrais aussi bien utiliser des vraies méthodes, ce serait juste plus lourd. Si on reprends le même exemple que ci-dessus, ça donnerait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool TestSiFooEgal42(MyClass x)
    {
        return x.Foo == 42;
    }
     
    int GetBar(MyClass x)
    {
        return x.Bar;
    }
     
    ...
     
    list.Where(TestSiFooEgal42).Select(GetBar);
    Avec une expression lambda, c'est comme si tu déclarais la fonction directement là où tu en as besoin. Le type des paramètres et le type de retour est inféré automatiquement par le compilateur en fonction du contexte.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Par défaut
    Est-ce que tu as de bonnes références pour apprendre les expressions lambda?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Leelith Voir le message
    Est-ce que tu as de bonnes références pour apprendre les expressions lambda?
    pas particulièrement... il y a sans doute des tutos un peu partout, sinon un bon bouquin sur C# 3 devrait couvrir ce sujet

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    la requête en VB serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim parents = (From nodes In XMLParent.Elements() Where nodes.Value.Equals(oldProjectName)).SingleOrDefault()
    En C# ????, peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var parents = (from nodes in XMLParent.Elements() where nodes.Value.Equals(oldProjectName) select nodes).SingleOrDefault();

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Par défaut
    Je viens de corriger le code, et il faut faire le code suivant pour que ça soit bon (une toute petite modification par rapport au code de Sehnsucht):

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    XElement project = xmlFile.Root.Elements().SingleOrDefault(xe => xe.Value == oldProjectName);

    Voilà voilà

  9. #9
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    en effet j'oublie souvent le Elements() ou le Descendants() quand j'écris en C# (l'habitude de pas en avoir nécessairement besoin en VB.Net)

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Par défaut
    Héhé pas de problèmes

    L'important n'est pas de macher le travail mais que je comprenne pour que la prochaine fois je puisse me débrouiller ^^

    Merci bien de ton aide

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/06/2015, 09h38
  2. Linq To XML avec silverlight ajouter un noeud
    Par maxxou dans le forum Silverlight
    Réponses: 7
    Dernier message: 22/11/2012, 15h42
  3. Réponses: 6
    Dernier message: 20/10/2010, 16h51
  4. remove avec linq to xml
    Par trouffiondesiles dans le forum Silverlight
    Réponses: 4
    Dernier message: 10/10/2010, 19h53
  5. [XML][XSL][FOP] transformation xml avec fop
    Par Le Marlou dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/12/2003, 16h58

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