Overblog
Suivre ce blog Administration + Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles RÉCents

2 février 2014 7 02 /02 /février /2014 01:02

1-      Exemple (ne pas oublier using à System.IO et using System.Xml.Serialization, ainsi que les éventuelles références)

Exemple Une classe static permettant de sérializer et déserializer une liste de contacts

internal static class Serializer

    {

        public static void Serialize(string fileName, Contacts contacts)

        {

            XmlSerializer serializer = new XmlSerializer(typeof(Contacts));

            using (StreamWriter writer = new StreamWriter(fileName))

            {

                serializer.Serialize(writer, contacts);

            }

        }

 

        public static Contacts Deserialize(string fileName)

        {

            XmlSerializer serializer = new XmlSerializer(typeof(Contacts));

            Contacts contacts;

            using (StreamReader reader = new StreamReader(fileName))

            {

                 contacts = (Contacts)serializer.Deserialize(reader);

            }

 

            return contacts;

        }

}

 

MainForm.cs

J’utilise dans l’exemple un bindingSource (+ bindingNavigator)

bindingSource1.DataSource = Serializer.Deserialize(fileName);

 

Serializer.Serialize(fileName, (Contacts)bindingSource1.DataSource);

 

2 – Sérialzation Xml générique

internal static class Serializer

    {

public static void Serialize<T>(string fileName, T obj)

        {

            XmlSerializer serializer = new XmlSerializer(typeof(T));

            using (StreamWriter writer = new StreamWriter(fileName))

            {

                serializer.Serialize(writer, obj);

            }

        }

 

        public static T Deserialize<T>(string fileName)

        {

            XmlSerializer serializer = new XmlSerializer(typeof(T));

            T obj;

            using (StreamReader reader = new StreamReader(fileName))

            {

               obj = (T)serializer.Deserialize(reader);

            }

            return obj;

        }

 

}

 

 

Exemple de fichier xml généré

<?xml version="1.0" encoding="utf-8"?>

<ArrayOfContact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <Contact>

    <contactId>1</contactId>

    <contactName>dupond</contactName>

    <contactFirstName>paul</contactFirstName>

    <purchase>10</purchase>

  </Contact>

  <Contact>

    <contactId>2</contactId>

    <contactName>durand </contactName>

    <contactFirstName>marc</contactFirstName>

    <purchase>15</purchase>

  </Contact>

</ArrayOfContact>

 

MainForm.cs

bindingSource1.DataSource = Serializer.Deserialize<Contacts>(fileName);

 

Serializer.Serialize<Contacts>(fileName,(Contacts) bindingSource1.DataSource);

 

 

3 -Attributs de controle

Astuce : ne pas oublier using System.Xml.Serialization;

 

XmlIgnore permet de ne pas sérializer ce membre

XmlElement permet de changer le nom de la balise générée

Exemple balise achat à la place de purchase

[XmlElement("Achat")]

        public int purchase

        {

            get { return _purchase; }

            set { _purchase = value; }

        }

 

<Achat>0</Achat>

 

XmlRoot change le nom pour la classe

XmlAttribute la propriété sera générée sous forme d’attribut

[XmlAttribute("id")]

        public int contactId

        {

            get { return _contactId; }

            set { _contactId = value; }

        }

 

<Contact id="0">

 

Etc.

http://tlevesque.developpez.com/dotnet/xml-serialization/#LII

Partager cet article
Repost0
9 juillet 2007 1 09 /07 /juillet /2007 23:59
Trier + Filtrer ses nœuds Xml
+ utiliser des paramètres  tout cela dans les expressions XPath
I - Tri
1 - Trie sur un XmlElement Texte > XmlDataType.Text
 
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("FirstName", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
2 - Trie sur un XmlElement nombre > XmlDataType.Number
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            // XPathExpression
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("Other/Age", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
3 - Tri sur Attribut
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            // XPathExpression
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("@ID", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
 
Note :
L’expression de tri est soit
> une valeur string (en fait expression XPath donnant le chemin vers élément ou attribut servant de champ de tri) exemple :
-          "@ID"
-          "FirstName"
-          "Other/Age"
Ø Soit une XPathExpression
oXPathExpression.AddSort("@ID", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
Ø 2 sens de tri
-          XmlSortOrder.Ascending (plus petit nombre vers le plus grand,ordre alphabétique)
-          XmlSortOrder.Descending
Ø Respect de la casse des caractères
Ø La prise en charge de la langue
Ø 2 types de valeurs XmlDataType.Text et XmlDataType.Number
 
II Des paramètres dans ses expressions XPath
Pendant que j’y suis , on peut utiliser des paramètres dans ses expressions XPath un peu comme ce que l’on fait avec les bases de données … l’avantage ? entre autres cela permet d’inserer des caractères tels ‘ dans ces expressions XPath
Voila un bon lien pour mieux comprendre 
il présente 3 méthodes :
- la classique avec string.Format
- une utilisant les variables Xslt
- une utilisant Mvp.xml (projet disponible  sur CodePlex) > http://www.codeplex.com/MVPXML
Un merci aussi à Bidou de CodeS-SourceS grace à qui j’ai su comment trier « dans les règles » une collection de nœuds Xml
Donc la conclusion est simple :
On peut à la fois filtrer les noeuds grace aux expressions XPath (avec utilisation même de paramètres)
mais également trier
(et même ajouter/supprimer bien sur  des nœuds au cours de l’iteration de XPathNodeIterator)
Ce qui donnerait pour exemple (filtre et tri + variables)
public System.Collections.IEnumerable GetContacts(string FirstName)
        {
            XPathExpression oXPathExpression = System.Xml.XPath.XPathExpression.Compile("/Contacts/Contact[starts-with(FirstName, $firstname)]");
        
            CustomContext oCustomContext = new CustomContext();
            oCustomContext.AddVariable("firstname", FirstName);
 
            oXPathExpression.SetContext(oCustomContext);
            oXPathExpression.AddSort("FirstName", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
 
            // iteration (les noeuds sont donc ici deja filtres et triés)
            System.Xml.XPath.XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
            System.Xml.XPath.XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
 
            while (oXPathNodeIterator.MoveNext())
            {
                yield return oXPathNodeIterator.Current.Value;
            }
        }
 
Le fichier Xml utilisé pour les exemples
<?xml version="1.0" encoding="utf-8" ?>
<Contacts>
 <Contact ID="1">
    <FirstName>eric</FirstName>
    <LastName>Dupond</LastName>
    <Gender>H</Gender>
    <Other>
      <Age>32</Age>
    </Other>
 </Contact>
 <Contact ID="58">
    <FirstName>Jeanne</FirstName>
    <LastName>Dupond</LastName>
    <Gender>F</Gender>
    <Other>
      <Age>20</Age>
    </Other>
 </Contact>
 <Contact ID="30">
    <FirstName>henri</FirstName>
    <LastName>Dumond</LastName>
    <Gender>H</Gender>
    <Other>
      <Age>15</Age>
    </Other>
 </Contact>
 <Contact ID="45">
    <FirstName>Paul</FirstName>
    <LastName>Durand</LastName>
    <Gender>F</Gender>
    <Other>
      <Age>28</Age>
    </Other>
 </Contact>
 <Contact ID="5">
    <FirstName>Luc</FirstName>
    <LastName>D'urand</LastName>
    <Gender>H</Gender>
   <Other>
     <Age>19</Age>
   </Other>
 </Contact>
</Contacts>
 
Et finalement Linq ne devient pas forcement necessaire, surtout que je me rends compte que Linq n’est pas dans tous les cas une avancée, mais la souplesse qu’il apporte dans la sélection des données est quand même très intéressante
 
Partager cet article
Repost0
29 juin 2007 5 29 /06 /juin /2007 10:11
XSD Code Generator 1.4.2.1 

un utilitaire qui permet de générér les classes (en vb ou c#) correspondantes à un schéma Xml
> après avoir installer l'utilitaire il suffit d'utiliser l'add in depuis le menu Outils de Visual Studio

http://www.microsoft.com/downloads/details.aspx?FamilyID=89e6b1e5-f66c-4a4d-933b-46222bb01eb0&DisplayLang=en
Partager cet article
Repost0
20 mars 2007 2 20 /03 /mars /2007 10:36
Visual Studio et ses outils XML – un peu plus loin

1- Saisie rapide XML

positonner le curseur à la fin du nom de la balise > presser la touche TAB > la fin de la ligne est générée comme "un snippet" avec la valeur surlignée

2 - Atteindre la définition d'un élémnt depuis le fichier XML (le schéma XSD pour ce fichier XML devant être défini auparavant bien entendu)

clic droit sur le nom de balise > Atteindre la définition > automatiquement on atteint la définition de cet éléément dans le schéma XSD correspondant

3 - Affciher le fichier XML ou seulement la partie sélectionnée dans un Datagrid

sélectionner les noeuds dans le fichier XML > clic droit > Afficher la grille de données

4 - Voir les schémas XSD Microsoft pour les fichiers XSD et XSL

on peut voir le schéma XSD Microsoft pour l'ensemble des éléments disponible pour les schémas XSD et les feuilles de style XSL en cliquant sur  un élément > atteindre la définition

5 - Déboggage XSLT - un peu plus loin

on dispose de toutes les options de déboggage classiques

ex : ajouter un espion > il suffit de cliquer droit sur l'element 'dans expression XPATH) de la feuille de style XSL > ajouter un espion

on peut également voir les valeurs des éléments parcourus dans le panneau variables locales ou en pointant de la souris l'élément de l'expression XPATH

Partager cet article
Repost0
20 mars 2007 2 20 /03 /mars /2007 01:05
ASTUCES AVEC VISUAL STUDIO 2005
INTELLISENSE XML - GENERATION XSD - DEBOGAGE XSLT ET DATASET TYPE
I Fichier Xml et son schéma XSD – disposer de l’intellisense et de la vérifcation de la validité
 
1 – Ouvrir ou Nouveau fichier Xml 
 
 
2 – dans le panneau propriétés > cliquer sur la propriété schéma (bouton avec 3 points) afin de définir le schéma Xml que devra respecter le fichier Xml
Parcourir jusqu’au schéma *.XSD désiré > ouvrir > OK (vérifier que le schéma est bien sélectionné dans la boite « Schémas XSD »)
 
3 – on a désormais l’intellisense dans le fichier Xml , de plus si on ne respecte pas le schéma ,Visual Studio l’indiquera en soulignant les éléments invalides
II Générer le schéma XSD d’un fichier Xml
 
Menu Xml > Créer un schéma
Il suffit ensuite de sauvegarder le schéma (qui s’affiche dans Visual Studio) dans le répertoire désiré, on peut ainsi utiliser ce schéma à sa convenance
III – Fichier Xml et feuille de style XSL – Afficher la sortie XSLT dans un web browser
 
1 -De la même manière on peut sélectionner la feuille de style *.xsl du fichier Xml (depuis le panneau propriétés propriété« feuille de style »> puis clic sur le bouton 3 points > puis parcourir jusqu »au fichier *.xsl désiré > ok)
2 - Afficher la sortie HTML dans un web browser
Menu XML > Afficher la sortie XSLT
 
 
IV Feuille de style XSL et fichier Xml - Déboguer au pas à pas
1 -Ouvrir la feuille de style XSL (*.xsl) désirée – puis définir l’entrée (c'est-à-dire le fichier *.xml qui entrera en jeu dans la transformation XSLT) panneau propriétés propriété « Entrée » > parcourir jusqu’au fichier *.xml > ouvrir
2 -Déboguer >> menu XML > Débogage XSLT
 
3 – on peut faire un pas à pas et voir la sortie HTML générée s’affichée petit à petit
 
V Fichier XSD et DataSet typé
 
 
De plus et pour finir je dirais vous ne l'avez peut etre jamais vu mais en ouvrant n'importe quel schéma XSD (à condition qu'il soit bien formé bien entendu) Visual Studio génére automatiquement un DataSet Typé
clic droit sur projet > ajouter > élément existant > parcourir jusqu'au schéma XSD désiré
un Dataset typé est alors généré - vous pouvez regarder côté Designer.cs le code a bien été généré
 
 
Partager cet article
Repost0
1 janvier 2007 1 01 /01 /janvier /2007 19:54
XML et les CSS
 
Soit la feuille de style suivante styles.css destinée à mettre en forme le fichier XML
-          On définie la manière dont sera affichée le fichier XML dans le navigateur (internet Explorer,Mozilla,…)
-          Pour chaque nœud, on peut soit le laisser vide, soit le définir  (il faut penser « poupées russes ou chaque balise est imbriquée comme des boites dans sa précédente)
REGIONS
{
width:200px;
height:30px;
background-color:Maroon;
}
REGION
{
display:block;
}
code_departement
{
color:Gray;
}
nom_departement
{
color:Red;
}
 
Et le fichier XML regions.xml
-          On lie la feuille des tyle au fichier XML
<?xmlversion="1.0"encoding="UTF-8" ?>
<?xml-stylesheettype="text/css" href="styles.css"?>
<REGIONS>
 <REGION>
    <code_departement>03</code_departement>
    <nom_departement>Allier</nom_departement>
 </REGION>
 <REGION>
    <code_departement>06</code_departement>
    <nom_departement>Alpes Maritmes</nom_departement>
 </REGION>
 <REGION>
    <code_departement>21</code_departement>
    <nom_departement>Côte d'or</nom_departement>
 </REGION>
 <REGION>
    <code_departement>34</code_departement>
    <nom_departement>Hérault</nom_departement>
 </REGION>
. . . etc.
  </REGIONS>
-          Il suffit de double cliquer sur le fichier XML pour qu’il s’affiche dans le navigateur par défaut :
 
 
Partager cet article
Repost0
1 janvier 2007 1 01 /01 /janvier /2007 12:40

XML - XSLT

Exemple simple et parlant

Soit le fichier XML

<?xmlversion="1.0"encoding="utf-8" ?>
<REGIONS>
 <REGION>
    <code_departement>03</code_departement>
    <nom_departement>Allier</nom_departement>
 </REGION>
 <REGION>
    <code_departement>06</code_departement>
    <nom_departement>Alpes Maritmes</nom_departement>
 </REGION>
 <REGION>
    <code_departement>21</code_departement>
    <nom_departement>Côte d'or</nom_departement>
 </REGION>
 <REGION>
    <code_departement>34</code_departement>
    <nom_departement>Hérault</nom_departement>
 </REGION>
. . .
</REGIONS>

 
Et le fichier XSL

<?xmlversion="1.0"encoding="iso-8859-1"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
 <!-- 1 -->
 <xsl:templatematch="/">
    <html>
      <bodystyle="background-color:#FFFFFF; color:#000000; font-size:9px; font-weight:bold">
        <divstyle="background-repeat:repeat-x; padding:2 px; margin:0 px; height: 79px; border: solid 1px white;">
          <h2>Rapport [Entreprises]</h2>
          <br />
          <table>
            <tr>
              <td>Code département</td>
              <td>Nom</td>
            </tr>
          </table>
          <!-- 2 -->
          <xsl:apply-templates/>
        </div>
      </body>
    </html>
 </xsl:template>
 
 <!-- 3  match = « expression xpath »-->
 <xsl:templatematch="REGIONS/REGION">
    <table>
      <tralign="center" style="background-color:#BC8F8F;">
        <tdstyle="color:white; background-color:#cc0000;font-weight:bold">
          <!--  select= "expression xpath" pour sélectionner élément du fichier xml à insérer-->
          <xsl:value-ofselect="code_departement"/>
        </td>
        <tdstyle="color:white; background-color:#cc0000;font-weight:bold">
          <xsl:value-ofselect="nom_departement"/>
        </td>
      </tr>
    </table>
 </xsl:template>
 
 
</xsl:stylesheet>
 

 

un excellent site sur tout ce qui touche à XML ou au web

http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/coursxsl/sommaire.html

Partager cet article
Repost0
15 décembre 2006 5 15 /12 /décembre /2006 17:21

Utilisation de XSD.EXE

(utilitaire du SDK de Visual studio 2003 et 2005)

1 - pour générer le schéma correspondant à un fichier XML

Démarche en invite de commande(exemple) :
1 - cd chemin vers SDK du framework .NET
cd C:/Program Files/Microsoft Visual Studio 8SDKv2.0/Bin
2 - exécuter l'utilitaire XSD.EXE
xsd.exe
3 - xsd "chemin vers fichier xml" /outputdir:chemin ou fichier sera généré
xsd "C:/Documents and Settings/<utilisateur>/Mes documents/Mediatheque.xml" /outputdir:C:/

2 - pour générer une classe (VB ou CS) correspondante à un schéma XSD (pour la sérialization XML)


xsd /classes /l:CS "C:/Documents and Settings/.../Mes documents/fichier.xsd"

--> le fichier de classe sera généré alors dans le reproire contenant les utilistaires du sdk de visual studio (C:/Program Files/Microsoft Visual Studio 8SDKv2.0/Bin)

 

 

Lien MSDN :

http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cptools/html/cpconXMLSchemaDefinitionToolXsdexe.asp

- Framework .NET 2.0

Partager cet article
Repost0