Aide sur les fichier XML [Résolu]

Signaler
Messages postés
100
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
24 mai 2013
-
Messages postés
14917
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
-
Bonjour
j'ai le fichier XML suivant
<resources xmlns="http://www.kuka.com/schemas/kxr/2009">
<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>
et je voudrais recuper l'info du message en fonction de la langue
j'ai essayer avec System.Xml.Linq; mais je n'arrive pas a grand chose
XmlDocument xmlDoc = new XmlDocument();
//Load xml
string filename = @"C:\KRC\DATA\Appli_KF.kxr";
XDocument xdoc = XDocument.Load(filename);
// XDocument xdoc = XDocument.Load(@"C:\KRC\DATA\Test.kxr");
XElement xElement = XElement.Load(filename);
//recupere l attribut xmlns ex xmlns="http://www.kuka.com/schemas/kxr/2009">
XNamespace p = xElement.Attribute("xmlns").Value;
var lv1s = (from lv1 in xdoc.Descendants(p + "module")
where ((string)lv1.Attribute("name") == "Appli_KF")
select new
{
Header = lv1.Attribute("name").Value,
Mess = (
from uiText in lv1.Descendants(p + "uiText")
where ((string)uiText.Attribute("key")== "MessageSUB1")
select new DroitTFS
{
Name = uiText.Attribute("key").Value,
}
).ToList<DroitTFS>()
}
);

//Loop through results
foreach (var lv2 in lv1s)
{

MessageBox.Show(lv2.Header +":"+ lv2.Mess[0].Name );
}

quelqu'un peut m'aider
Jean louis

4 réponses

Messages postés
14917
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
Bonjour


avec VS express 2008 xmlns="http://www.kuka.com/schemas/kxr/2009 ne passe pas avec Linq (je n'ai pas trop cherché pourquoi). Pour faire mes essais j'ai donc modifié ton exemple xml comme suit

<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>



J'ai crée 3 classes:
        /// <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; }
        }



et la méthode pour charger le xml
        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

        }


Pour completer ce que dit Buno je t'invite à lire cette citatiopn de NHenry et les liens associés:
[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



Whismeril
Messages postés
14815
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 octobre 2020
93
Hello,
Merci de formater un peu mieux ta demande...


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
100
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
24 mai 2013

j'ai essayer ça et cela à l'air de marcher merci Whismeril
je vais tenir compte de tes remarques et modifié mon encore merci

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;

        }


Jean louis
Messages postés
14917
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 octobre 2020
447
De rien


Whismeril