XElement et Linq

    Publié le : 08-12-2019 10:25

    Introduction :

    Le XML (pour Extensible Markup Language) est un métalangage de données structurées. C'est un sous ensemble du SGML (Standard Generalized Markup Language). La principale force de ce métalangage repose sur la possibilité qu'il offre d'étendre facilement le contenu de sont arborescence.

    La manipulation des données XML est grandement facilité par l'utilisation de Linq (Language Integrated Query). La classe XElement présente en Csharp dans l'espace de nom System.Xml.Linq permet de manipuler et de créer simplement des arborescences XML.

    Pour les besoins de cet article, notre fichier XML de référence sera "params.xml" qui contiendra l'arborescence suivante :

    <?xml version="1.0" encoding="utf-8" ?>
    
    <root>
      <setting password="d93ace0af68cfa3402414090c5d05b6a3a5596b3d4da">
        <port type="TCP">8000</port>
        <output>true</output>
        <hide_console>false</hide_console>
    
        <programs>
          <program id="1" get_output_stream="false" allowed="false"> <![CDATA[C:\programs\1\athena.exe]]></program>
          <program id="50" get_output_stream="false" allowed="true"> <![CDATA[C:\programs\50\firefox.exe]]></program>
        </programs>
      </setting>
    </root>

     

    Chargement d'un fichier en variable :

    Ici l'appel de la méthode Load permet collecter le contenu du fichier params.xml et de créer implicitement un objet XElement dans la variable Xet. Celle contiendra donc le contenu présentédans l'introduction.

    XElement Xet = XElement.Load("params.xml");

    Boucler sur des noeuds

    Pour effectuer une boucle sur les noeuds program, il suffit d'utiliser les méthodes offertes par Linq (ici Element et Descendants) il est important de souligner que ces méthodes peuvent se cumuler dans le même appel.

    foreach (XElement p in Xet.Element("setting").Element("programs").Descendants("program"))
    {
       //Récupération de la valeur du noeud program 
       String Path_File = p.Value; 
       
       //Récupération et cast en boolean de la valeur de l'attribut allowed du noeud program
       Boolean Allowed = Boolean.Parse(p.Attribute("allowed").Value); 
       
       //Récupération et cast en entier la valeur de l'attribut id du noeud program
       Int32 Id = Int32.Parse(p.Attribute("id").Value); 
       
       //Code...
    }

    Sélectionner le premier noeud dans la liste des descendants

    XElement program_first = Xet.Element("setting").Element("programs").Descendants("program").First();
    

    Sélectionner le dernier noeud dans la liste des descendants

    XElement program_first = Xet.Element("setting").Element("programs").Descendants("program").Last();
    

    Filtrer des noeuds par la valeur d'un attribut dans la liste des descendants

    IEnumerable<XElement> programs = Xet.Element("setting").Element("programs").Descendants("program").Where(x => Int32.Parse(x.Attribute("id").Value) == 50);
    
    XElement program_50 = programs.First();

     Alimenter un XElement

    Xet.Element("setting").Element("Programs").Add(
    new XElement("program",
                 new XAttribute("id", 5),
                 new XAttribute("allowed",true),
                 new XAttribute("get_output_stream", false),
                 new XCData(@"C:\programs\5\demo.exe")));                                  

    Le résultat de cette manipulation sera la sortie suivante :

    <?xml version="1.0" encoding="utf-8" ?>
    
    <root>
      <setting password="d93ace0af68cfa3402414090c5d05b6a3a5596b3d4da">
        <port type="TCP">8000</port>
        <output>true</output>
        <hide_console>false</hide_console>
    
        <programs>
          <program id="1" get_output_stream="false" allowed="false"> <![CDATA[C:\programs\1\athena.exe]]></program>
          <program id="50" get_output_stream="false" allowed="true"> <![CDATA[C:\programs\50\firefox.exe]]></program>
          <program id="5" get_output_stream="false" allowed="true"> <![CDATA[C:\programs\5\demo.exe]]></program>
        </programs>
      </setting>
    </root>

    Sauvegarder un XElement

    Pour sauvegarder un XElement l'appel de la méthode static Save (en spécifiant en premier paramètre un emplacement existant) permet de créer (ou d'écraser) un fichier de sortie.

    Xet.Save("save.xml");