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 :

[Débutant C#] Methodes prenant objets en paramètres et XPathNavigator


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Par défaut [Débutant C#] Methodes prenant objets en paramètres et XPathNavigator
    Bonjour,

    Tout d'abord désolé si le titre n'est pas évocateur, j'ai du mal à identifier le problème

    Je débute sous C# et avec l'aide de la FAQ (géniale, bravo aux auteurs), j'arrive à peu près a faire ce que je veux.

    Cependant je tombe sur un problème obscur en manipulation de fichiers XML.

    J'utilise un objet XPath + XPathNavigator + XPathNodeIterator pour arriver à mes fins.
    Donc tout se passe bien, je navigue à travers mes nodes et j'utilise la méthode .Clone() de mon Navigator (par l'intermédiaire de l'Iterator, cet exemple est vastement exemplifié dans le MSDN donc j'imagine que c'est la bonne façon de faire) pour parser les éléments enfants de mon node, ou les paramètres.

    Histoire de ne pas faire de redondance de code et de "m'entrainer" au développement objet, j'essaye de regrouper mes bouts de code en méthodes.

    Je crée donc une méthode qui reçoit en paramètre un objet de type XPathNavigator. La méthode clone l'objet, et utilise la nouvelle instance pour parcourir mes paramètres sans que mon navigator original ne se déplace (pour pas perdre le fil).

    Lorsque j'appelle ma méthode dans mon code, il semble qu'il y ait un problème au niveau du passage de paramètres. Voici mon code :

    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
     
    class Program
        {
            //Ma fameuse méthode, retourne la liste d'attributs d'une node
            string processattributes(XPathNavigator orgnav)
            {
                XPathNavigator mynav = orgnav.Clone();
                string outputstring = "";
                mynav.MoveToFirstAttribute();
                outputstring+=" "+mynav.Name + "=\"" + mynav.Value+"\"";
                while (mynav.MoveToNextAttribute())
                    outputstring += " "+mynav.Name + "=\"" + mynav.Value + "\"";
                return outputstring;
            }
     
            static void Main(string[] args)
            {
                string mystring;
                string fileName = @"d:\db.xml";
                XPathDocument doc = new XPathDocument(fileName);
                XPathNavigator nav = doc.CreateNavigator();
                XPathNodeIterator iter = nav.SelectDescendants("Item","",false);
                while (iter.MoveNext())
                {
                    XPathNavigator nav2 = iter.Current.Clone();
                    mystring = "<" + nav2.Name;
                    if (nav2.HasAttributes)
                        mystring += processattributes(nav2);
                    mystring += ">";
                    Console.WriteLine(mystring);
                    if(nav2.HasChildren)
                    {
                        nav2.MoveToFirstChild();
                        mystring = "<" + nav2.Name;
                        if (nav2.HasAttributes)
                            mystring += processattributes(nav2);
                        mystring += ">";
                        if (!nav2.IsEmptyElement)
                            mystring += "</" + nav2.Name + ">";
                        else
                            mystring += " />";
                        Console.WriteLine(mystring);
                        string titi = Console.ReadLine();
                        while (nav2.MoveToNext())
                        {
                            mystring = "<" + nav2.Name;
                            if (nav2.HasAttributes)
                                mystring += processattributes(nav2);
                            mystring += ">";
                            if (!nav2.IsEmptyElement)
                                mystring += "</" + nav2.Name + ">";
                            else
                                mystring += " />";
                            Console.WriteLine(mystring);
                            titi = Console.ReadLine();
                        }
                    }
                }
            }
        }
    Comme vous l'aurez compris, ce code ne sert a rien en soi (afficher chaque élément "Item" du fichier XML, ainsi que ses attributs/valeurs dans l'output console. Je cherche juste à appréhender le fonctionnement de C#. J'arrive à obtenir ces résultats avec un XmlTextReader, mais j'avoue qu'il me semble plus "propre" de travailler avec XPath. Il contient surement des erreurs logiques mais n'ayant pas pu pour l'instant tester l'output (je veux en finir avec ce problème de méthode avant de rendre les choses plus "propres), je ne suis certain de rien. Enfin ce n'est de toute façon pas l'objet du problème.

    A la compilation, j'ai des messages d'erreurs pour les 3 appels de ma méthode processattributes (ConsoleXML est le nom de mon namespace/projet):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'ConsoleXML.Program.processattributes(System.Xml.XPath.XPathNavigator)'
    Est ce que quelqu'un a une idée sur les raisons de cette erreur ? En effet le code fonctionne lorsque le code de la méthode est utilisé directement à la place de l'appel à la méthode.

    En vous remerciant par avance de votre aide, et en espérant que je n'ai pas été trop "long" dans mon explication, mais j'essaye d'être le plus précis possible.

    D'avance merci
    Toup

  2. #2
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    tu appel ta function sans instancier ta classe :
    2 solutions ou instancie ta class ou tu definie ta function come static :

    2eme solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Ma fameuse méthode, retourne la liste d'attributs d'une node
            static  string processattributes(XPathNavigator orgnav)
            {
                XPathNavigator mynav = orgnav.Clone();
    //puis tu fais : dans ton main :

    string result= maClass.processattributes(..);

    1ere solution :
    dans ton main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClass mc = new MaClass;
    string result = mc.ProcessAttributes(...)

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Par défaut
    Merci bien pour ta réponse, le passage en static a tout résolu. J'imagine que ce n'est pas la meilleure solution, mais comme je ne travaille pas avec d'autres classes que celle "Program" qui est le corps de ce qui sera executé en mode console, je vais m'en tenir au passage en static pour le moment.

    En tout cas merci encore.
    Toup

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

Discussions similaires

  1. [WD10]Passage d'objet en paramètres de methode
    Par Isildur dans le forum WinDev
    Réponses: 25
    Dernier message: 26/03/2007, 17h35
  2. [POO] débutant passer un objet en paramètre
    Par samplaid dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/05/2006, 12h46
  3. [DLL] Passage d'objet en paramètre
    Par TitiFr dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2005, 23h18
  4. Réponses: 5
    Dernier message: 17/08/2005, 12h40
  5. [débutante][Concept] Destruction d'objet, mode d'emploi?
    Par skea dans le forum Général Java
    Réponses: 4
    Dernier message: 12/06/2004, 21h48

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