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 :
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.
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(); } } } } }
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):
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.
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)'
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
Partager