<resources> <module name="Appli_KF"> <text xml:lang="de-DEV">No Pressure</text> <text xml:lang="en-DEV">No Pressure</text> <text xml:lang="fr-DEV">Manque presence air</text> <text xml:lang="es-DEV">spain</text> <text xml:lang="de-DEV">robot vartung stellung</text> <text xml:lang="en-DEV">Robot in parking position</text> <text xml:lang="fr-DEV">Robot au repli</text> </module> </resources>
/// <summary> /// Classe décrivant un module avec un nom et une liste de messages /// </summary> class Module { public string Nom { get; set; } public List<MessageSub> Messages { get; set; } } /// <summary> /// Classe décrivant un message avec une clé et une liste de textes multilingues /// </summary> class MessageSub { public string Key { get; set; } public List Langues { get; set; } } /// <summary> /// Classe décirvant une traduction /// </summary> class UneLangue { public string Langue { get; set; } public string Texte { get; set; } }
private void TestXML() { //Load xml string filename = Application.StartupPath + @"\toto.xml"; XDocument xDoc = XDocument.Load(filename); List<Module> mesModules;// quand on peut éviter une variable de type var s'est mieux mesModules = (from monModule in xDoc.Descendants("module")//dans xDoc, on passe en revue chaque occurence de "module" select new Module//crée une nouvelle instance de ma classe Module { Nom = monModule.Attribute("name").Value,// on extrait l'attribut mane de l'occurence en cours Messages = (from monMessage in monModule.Descendants("uiText")//dans monModule, on passe en revue chaque occurence de "uiText" select new MessageSub { Key = monMessage.Attribute("key").Value,//on extrait l'attribut key Langues = (from maLangue in monMessage.Descendants("text") //dans un message, on passe en revue chaque occurence de "text" select new UneLangue { Langue = maLangue.FirstAttribute.Value, Texte = maLangue.Value }).ToList()//direct en List dans le champ Langues }).ToList<MessageSub>()//direct en List<MessageSub> dans le champ Messages }).ToList<Module>();//direct en List<Module> dans la variable mesModules }
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
class cXml { private List<cMsg> Msg = new List<cMsg>(); class cMsg { public string Translate = ""; } public string filename { get; set; } public string MsgNotfound { get; set; } public bool User { get; set; } public string FindMessage(string TypeMess, decimal numMess, string LangKey) { XmlDocument xmlDoc = new XmlDocument(); //Load xml XDocument xDoc = XDocument.Load(filename); XElement xElement = XElement.Load(filename); //recupere l attribut xmlns ex xmlns="http://www.kuka.com/schemas/kxr/2009"> XNamespace xmlns = xElement.Attribute("xmlns").Value; string key="Syst_WopMess" + TypeMess + numMess.ToString(); if (User) key = "User_WopMess" + TypeMess + numMess.ToString(); Msg = (from msgKey in xDoc.Descendants(xmlns + "text") // Je viens directement au noeud suscitant l'intérêt where (((string)msgKey.Parent.Attribute("key") == key) && ((string)msgKey.FirstAttribute == LangKey)) select new cMsg { Translate = (string)msgKey.Value, } ).ToList<cMsg>(); if (Msg.Count > 0) return Msg[0].Translate; else return MsgNotfound; }