Les articles de ESSI# - La sérialisation XML sous .NET facile |
RACINE |
Si vous voyez ceci ... | ...ça veut dire cela. |
IDisposable Interface | C'est un lien vers une page d'aide du .NET Framework SDK. Ce lien ne fonctionnera que si le .NET framework SDK ANGLAIS est installé sur votre poste courant. Si vous avez la version française, modifiez les liens comme suit : ms-help://MS.NETFrameworkSDK/... en ms-help://MS.NETFrameworkSDK.Fr/... Ok, c'est pas forcément une bonne idée de Microsoft, mais c'est ainsi ... :( |
--> téléchargez le source |
C'est un lien vers un fichier téléchargeable hosté sur le même site. |
retour à l'index
Cliquez ici pour obtenir le .NET Framework SDK (130 Mo). |
xsd.exe
qui peut (entre autre) générer un ensemble de classes C# (ou autre langage .NET) qui correspondent à celles présentes dans votre fichier XSD : ce sont les complexType
et les element
"à la racine".> xsd.exe /classes /l:CS monschema.xsd
/classes
: indique que vous désirez que xsd.exe
génère (dans le fichier qu'il va produire) les classes correspondantes à celles contenues dans votre fichier .xsd . Vous auriez pu préciser /dataset
à la place, pour qu'en fait ce soit une sous classe de DataSet
connaissant vos classes qui soit produite./l:CS
: vous désirez du code C#monschema.xsd
: votre fichier XSDxsd.exe
refuse votre schéma. Et pour le fun, il lève une belle exception prétextant un "Stack overflow" ! Si vous êtes malheureusement dans ce cas (et cela m'est arrivé) sautez au chapitre Sérialisation XML avancée.retour à l'index
1: XmlSerializer serializer = new XmlSerializer(typeof(LeTypeRacine)); 2: 3: TextReader reader = new StreamReader("unfichierXML.xml"); 4: LeTypeRacine root = (LeTypeRacine)serializer.Deserialize(reader); 5: 6: reader.Close();
#Ligne | |
1 |
Il faut créer un objet qui puisse sérialiser et déserialiser votre arborescence de classes. La chose interressante à remarquer est que vous passez un Type en paramètre du constructeur du sérialiseur. Grâce à cela, et aux attributs de sérialisation qui ont été générés par xsd.exe , le sérialisateur sera à même de manipuler ces classes et de reconstruire l'arbre contenu dans le flux XML très facilement.Pour l'exemple, le type de base attendu dans le flot XML est LeTypeRacine .
|
3 |
Création d'un reader sur le fichier XML contenant les données à déserialiser. |
4 |
En une ligne, le contenu entier du fichier XML est déserialisé en un objet correspondant à l'élément racine du fichier XML. |
6 |
On ferme le reader, c'est mieux. |
retour à l'index
LeTypeRacine
de nom root
.
1: XmlSerializer serializer = new XmlSerializer(typeof(LeTypeRacine)); 2: 3: TextWriter writer = new StreamWriter("unfichierXML.xml"); 4: serializer.Deserialize(writer, root); 5: 6: writer.Close();
retour à l'index
xsd.exe
le refusexsd.exe
refuse de faire le boulot pour vous, vous allez devoir mettre les mains dans le cambouis. Comment ? Ceci revient à répondre à la question "que fait xsd.exe ?".using
est nécessaire : using System.Xml.Serialization;
[XmlAttributeAttribute()]
. Par exemple :
public class LaClasse{ [XmlAttributeAttribute()] public string unattribut; }
Nom | Explication | S'applique sur |
XmlAttributeAttribute |
L'attribut doit être sérialisé comme un attribut du noeud XML. Ainsi le code suivant :
public class LaClasse{ [XmlAttributeAttribute(DataType="string")] public string unattribut; }... produit l'XML suivant ... <LaClasse unattribut="une valeur string" />Remarquez la propriété DataType = "string" qui indique comment écrire la valeur de l'attribut. Sachez qu'énormément de types sont disponibles (date, byte, duration, etc...). Regardez la doc de XmlAttributeAttribute.DataType.Sachez enfin que si vous précisez la propriété AttributName= "unAutreNom" , l'attribut portera le nom unAutreNom dans le fichier XML.
|
attribut |
XmlIgnoreAttribute |
L'attribut doit être ignoré et ne pas être sérialisé. Ainsi le code suivant :
public class LaClasse{ [XmlIgnoreAttribute()] public string unattribut; }... produit l'XML suivant ... <LaClasse /> |
attribut |
XmlElementAttribute |
L'attribut doit être sérialisé comme un sous-élément. Ainsi le code suivant :
public class LaClasse{ [XmlElementAttribute()] public string unattribut; }... produit l'XML suivant ... <LaClasse> <unattribut>un string ...</unattribut> </LaClasse>Vous pouvez comme avec XmlAttributeAttribute préciser un type, un nom, etc ... pour l'élément.
|
attribut |
XmlRootAttribute |
La classe représente le type de l'élément racine du document XML. En exemple, le code suivant :
[XmlRootAttribute()] public class LaClasse{ public string unattribut; }Vous pouvez comme avec XmlAttributeAttribute préciser un nom, etc ... pour l'élément. Vous pouvez préciser s'il est obligatoire, un namespace, etc...
|
classe |
retour à l'index
Cliquez ici pour obtenir le source et l'EXE du programme. |
Personne
ayant certains attributs sérialisés (nom, age) et certains non sérialisés (numsécu). Un Personne
possède aussi au tableau de Voiture
(une classe ayant comme simple attribut un numéro de plaque).Personne
, on sérialise, on désérialize, et on regarde si on a le résultat attendu !Personne, Voiture
)La classe Personne (extrait !)
La classe Voiture
Le programme de test
retour à l'index
retour à l'index
retour à l'index
retour à l'index
par Alain Vizzini (vizzini@essi.fr )
pour l'ESSI & Microsoft, création 21-01-2003, dernière màj 26-01-2003