A la fin de cet article, vous n'aurez plus aucun doute (du moins, je l'espère !) quand aux possibilités de remplacement de bases de données modestes par des fichiers XML.
Bien sûr, ce Part. n'est pas le dernier de cette série et vous découvrirez encore bien des possibilités, au fil des prochains Parts, concernant la prise en charge d'XML par .NET.
■ Vérifier l'existence du fichier XML : Classe System.IO.FileInfo
Dans le précédent Part, je vous avais expliqué qu'avant de lire un document XML, il fallait le charger et que l'on effectuait ce chargement au sein d'un bloc
try/catch parce qu'en cas de document mal formé, une exception était levée.
Et bien, je vous propose d'ajouter un contrôle supplémentaire en amont du chargement : Vérifier l'existence du fichier XML que l'on souhaite éditer.
Si il n'existe pas, alors il faudra le créer.
C'est pour cette raison (dans l'exemple suivant) que je place mon bloc
try/catch dans une structure de contrôle
if.
J'effectue le test d'existence du fichier XML à l'aide de la propriété booléenne
Exists de la classe
FileInfo(string fileName) de l'espace de nom
System.IO.
filename représente l'URL du fichier à vérifier.
Exemple 9
// Construction de la chaîne contenant le chemin d'accès au document XML string strCurrentPath = Request.PhysicalApplicationPath; string strXmlPath = strCurrentPath + "data\\books.xml";
// Création d'une instance de l'objet XmlDocument XmlDocument objXmlDoc = new XmlDocument(); // Création d'une instance de l'objet FileInfo FileInfo objFi = new FileInfo(strXmlPath);
// Vérifie l'existence du fichier XML if (objFi.Exists) { // Essaye de charger le document XML try { objXmlDoc.Load(strXmlPath); } catch(Exception err) { Response.Write("<font color=red><b>Chargement du document XML impossible !</b>" + "<br>Exception : " + err.Message + "</font>"); }
// Récupération de l'élément racine XmlNode objRoot = objXmlDoc.DocumentElement;
// Redirection vers une éventuelle fonction qui permettrait // l'édition du document XML existant Fonction_Edition_Document(); } else { // Placer ici le code utilisateur pour la création du document ... }
|
■ Insérer des noeuds : méthodes InsertBefore() et InsertAfter()
Ces 2 méthodes de la classe
XmlDocument sont héritées de la classe
XmlNode et permettent l'ajout de nouveaux noeuds à un document XML.
InsertBefore(XmlNode newChild, XmlNode refChild) permet d'ajouter le noeud
newChild immédiatement avant le noeud référencé par
refChild.
InsertAfter(XmlNode newChild, XmlNode refChild) permet d'ajouter le noeud
newChild immédiatement après le noeud référencé par
refChild.
1 - Déclaration XML : classe XmlDeclaration - méthode CreateXmlDeclaration()
La création d'une déclaration XML s'effectue avec la méthode
XmlDocument.CreateXmlDeclaration(string version, string encoding, string standalone), ou version représente le numéro de la version XML (attribut version), encoding représente le type d'encodage (attribut encoding) et standalone représente l'attribut d'autonomie par rapport à une DTD (attribut standalone). 3 valeurs possibles pour standalone : "yes" - "no" ou null.
// Création et insertion de la déclaration XML XmlDeclaration objDeclare; objDeclare = objXmlDoc.CreateXmlDeclaration("1.0","utf-8",null); objXmlDoc.InsertBefore(objDeclare, objXmlDoc.DocumentElement);
|
2 - Doctype : classe XmlDocumentType - méthode CreateDocumentType()
Cette méthode permet de créer la déclaration du type de document (le DOCTYPE) et donc de lier le document XML à une DTD externe ou de créer la DTD en interne.
XmlDocument.CreateDocumentType(string name, string publicId, string systemId, string internalSubset) ou
name représente le nom du type principal (l'élément racine par exemple),
publicId représente l'identificateur public,
systemId représente l'identificateur systeme (URL de la DTD externe) et
internalSubset représente la définition du type de document (pour une DTD interne). Les trois derniers arguments peuvent prendre la valeur null.
// Création et insertion d'une DTD externe XmlDocumentType objDoctype; objDoctype = objXmlDoc.CreateDocumentType("books", null, "books.dtd", null); objXmlDoc.InsertAfter(objDoctype,objDeclare);
|
3 - Commentaire XML : classe XmlComment - méthode CreateComment()
La création d'un commentaire XML s'effectue avec la méthode
XmlDocument.CreateComment(string data), ou data représente la chaîne de caractères composant le commentaire
// Création et insertion d'un commentaire XML XmlComment objComment; objComment = objXmlDoc.CreateComment("Collection de livres sur .NET"); objXmlDoc.InsertAfter(objComment, objDoctype);
|
4 - Elément XML : classe XmlElement - méthode CreateElement()
La création d'un élément XML s'effectue avec la méthode
XmlDocument.CreateElement(string name), ou name représente le nom de l'élément XML à ajouter. Il est à noter que la méthode CreateElement() possède 2 autres surcharges.
// Création et insertion d'un élément XML XmlElement objElmt; objElmt = objXmlDoc.CreateElement("books"); objXmlDoc.InsertAfter(objElmt, objComment);
|
■ Enregistrement d'un document XML : méthode XmlDocument.Save()
La méthode
Save() possède 4 surcharges; celle qui nous intéressera ici est :
Save(string filename) ou filename représente l'URL du fichier XML à enregistrer.
Exemple 10
... else { // Placer ici le code utilisateur pour la création du document // Création et insertion de la déclaration XML XmlDeclaration objDeclare; objDeclare = objXmlDoc.CreateXmlDeclaration("1.0","utf-8",null); objXmlDoc.InsertBefore(objDeclare, objXmlDoc.DocumentElement);
// Création et insertion d'une DTD externe XmlDocumentType objDoctype; objDoctype = objXmlDoc.CreateDocumentType("books", null, "books.dtd", null); objXmlDoc.InsertAfter(objDoctype,objDeclare);
// Création et insertion d'un commentaire XML XmlComment objComment; objComment = objXmlDoc.CreateComment("Liste des livres sur .NET"); objXmlDoc.InsertAfter(objComment, objDoctype);
// Création et insertion d'un élément XML XmlElement objElmt; objElmt = objXmlDoc.CreateElement("books"); objXmlDoc.InsertAfter(objElmt, objComment);
// Sauvegarde (écriture du fichier) du document sur le disque objXmlDoc.Save(strXmlPath); // Redirection vers une fonction qui permettrait l'ajout // de nouveaux enregistrements au document XML existant Ajouter_Enregistrement(); }
|
Noter que lors de la création d'un nouveau document XML, seul l'ajout d'un
élément racine est obligatoire. Si l'élément racine est absent lors de
l'enregistrement une exception est levée : System.Xml.XmlException:
Document XML Le document n'a pas d'élément racine. non valide.