Version imprimable       Envoyer     
Cliquez pour évaluer et commenter
MSDN
MSDN Library
Conception de XML Notepad 2006
Paru le 04 octobre 2006

Chris Lovett - Microsoft

Août 2006

Résumé : Cet article présente la nouvelle version de XML Notepad. Bien que l'outil ait été introduit pour la première fois en 1998, il est resté indisponible pendant plusieurs années. Cette version exploite System.Xml et apporte de nouvelles fonctionnalités.

Sur cette page

Conception et implémentation Conception et implémentation
Validation, IntelliSense et éditeurs personnalisés Validation, IntelliSense et éditeurs personnalisés
Annuler/Rétablir illimité Annuler/Rétablir illimité
Test des unités Test des unités
Conclusion Conclusion

Je me suis finalement déplacé pour tenir une promesse faite à un ami chez MSDN. En 1998, nous avions publié XML Notepad, écrit par Murray Low en C++. Plus tard, il s'est avéré incompatible avec les normes XML et nous l'avons retiré de MSDN, parce nous n'avions pas le temps de résoudre ce problème. Cependant, compte tenu du travail apparemment bon de Murray, MSDN a été submergé de demandes de réintroduction du bloc-notes. MSDN m'a donc demandé de le remplacer.

Je travaille sur System.Xml en C# depuis 1999, je supposais donc pouvoir développer assez rapidement une application de remplacement à l'aide de .NET Framework. Le problème résidait cependant dans le fait qu'il s'agissait d'un de mes projets secondaires de ma liste « journalière » — vous savez comment cela se passe ! Heureusement, un de mes amis, Michael Corning, s'y est intéressé, m'a aidé à développer ce projet et a également ajouté lui-même certaines fonctionnalités intéressantes. Dan Doris a également eu pitié de moi et m'a aidé à identifier certains bogues importants. Cela a abouti à un outil susceptible d'être utile aux personnes souhaitant consulter et éditer rapidement des documents XML.

Pour ceux qui connaissent la version originale, l'interface devrait leur être familière : une arborescence sur la gauche synchronisée avec un aperçu du texte de nœud sur la droite et des boutons de barre d'outils simples d'utilisation pour un déplacement rapide des nœuds vers le haut et le bas de l'arborescence (voir figure 1). En raison de la trop longue période qui a suivi la première version, j'ai dû exploiter les fonctionnalités intéressantes de System.Xml et en ajouter certaines dont ne disposait pas la version initiale :

  • Recherche incrémentielle (CTRL+I) dans l'arborescence et l'aperçu de texte, pour qu'au cours de la saisie vous puissiez accéder au nœud correspondant le mieux.

  • Couper/copier/coller avec prise en charge d'un espace de nom complet dans un format XML simple et interopérable.

  • Prise en charge du glisser/déplacer pour une manipulation facile de l'arborescence, même à travers différentes instances de XML Notepad et à partir du système de fichiers.

  • Annuler/rétablir illimité pour toutes les opérations d'édition.

  • Édition sur place, contextuelle et à plusieurs lignes de valeurs importantes de nœud de texte et IntelliSense basé sur des attributs et des éléments attendus.

  • Couleurs et polices configurables via la boîte de dialogue Options.

  • Boîte de dialogue rechercher/remplacer complète avec prise en charge des expressions regex et XPath.

  • Bonnes performances sur des documents XML importants (chargement d'un document de 3 Mo en une seconde environ).

  • Validation instantanée d'un schéma XML lors d'une édition avec erreurs et avertissements s'affichant dans la fenêtre Liste des tâches (task list).

  • Prise en charge pour les éditeurs personnalisés des date, date-heure, heure et types de données de couleur.

  • Visionneuse HTML pour l'affichage des résultats de transformation XSLT.

  • Outil XML Diff intégré.

Conception et implémentation

Dans le package de téléchargement, vous trouverez le projet dll principal XmlNotepad, un projet d'application générant XmlNotepad.exe, les projets de bibliothèque XmlDiff utilisés dans la fonctionnalité XML diff, un projet d'installation pour la génération de l'installeur .msi, le projet UnitTest pour le test de XML Notepad et un projet d'aide pour la génération du fichier Help.chm à l'aide des outils HTML Help Workshop.

Figure 1. Interface de XML Notepad
Figure 1. Interface de XML Notepad

Le schéma suivant présente les relations entre les principales classes de l'interface utilisateur. Le formulaire principal contient tous les éléments d'interface utilisateur, de TaskList à XmlTreeView en passant par Resizers ; il s'agit du point de lancement de boîtes de dialogue telles que FormSearch, FormSchemas, FormOption et FormAbout.

Figure 2. Classes d'interface utilisateur principales
Figure 2. Classes d'interface utilisateur principales

Le contrôle onglet principal contient les fonctions XmlTreeView et XsltViewer pour l'affichage des résultats XSL. XmlTreeView se compose de TreeView à gauche et de NodeTextView à droite, et coordonne le défilement entre ces deux affichages. TreeView et NodeTextView fournissent la même fonctionnalité d'édition IntelliSense à l'aide d'un composant TextEditorOverlay. XmlTreeView implémente IFindTarget, utilisé par la boîte de dialogue Rechercher (FormSearch) pour implémenter la fonctionnalité rechercher/remplacer.

Figure 3. Boîte de dialogue Rechercher
Figure 3. Boîte de dialogue Rechercher

La boîte de dialogue Rechercher prend en charge les expressions en texte intégral, regex ou XPath, et peut filtrer par noms ou valeurs. Vous apercevez ici la recherche XPath, qui fournit également un tableau de saisie des mappages de préfixe d'espace de nom utilisés dans la requête.

Validation, IntelliSense et éditeurs personnalisés

La nouvelle fonctionnalité la plus importante est IntelliSense, pilotée par les informations de schéma XML fournies via SchemaCache. Par exemple, si votre élément ou attribut est défini par un simpleType XSD et que ce simpleType contient une liste de facets d'énumération, vous obtiendrez une liste déroulante identique à la suivante :

Figure 4. Valeurs de la liste déroulante
Figure 4. Valeurs de la liste déroulante

Le vérificateur s'exécute après chaque opération d'édition pour valider le document et signaler les erreurs dans la Liste des tâches (TaskList). Ce processus introduit également les informations System.Xml.Schema.XmlSchemaType dans chaque élément et attribut XmlDocument ; ensuite, lors de l'édition de la valeur de ce nœud, TextEditorOverlay utilise XmlIntelliSenseProvider pour obtenir une liste de valeurs possibles. Dans l'exemple ci-dessus, les valeurs sont renvoyées à partir des facets d'énumération simpleType. Pour un nom d'élément IntelliSense dans l'arborescence, XmlIntelliSenseProvider appelle de nouveau le vérificateur, capture GetExpectedParticles et GetExpectedAttributes dans System.Xml.Schema.XmlSchemaValidator et les utilise pour fournir IntelliSense.

Figure 5. IntelliSense dans une arborescence
Figure 5. IntelliSense dans une arborescence

TextEditorOverlay prend également en charge les éditeurs personnalisés tels que DateTimeEditor, UriBuilder ou ColorBuilder. Il existe deux types d'éditeurs personnalisés : IXmlEditors, qui sont des éditeurs en ligne remplaçant TextBox et IXmlBuidlers, des boîtes de dialogue contextuelles telles que OpenFileDialog ou ColorDialog. Le type d'éditeur est dérivé des informations sur le type de schéma — résultats "xs:date", "xs:time", "xs:datetime" dans DateTimeEditor et résultats "xs:anyURI" dans UriBuilder. Vous pouvez également annoter le schéma à l'aide d'un attribut « vs:builder » dans l'espace de noms « http://schemas.microsoft.com/Visual-Studio-IntelliSense ». Pour plus d'informations, consultez l'aide.

Annuler/Rétablir illimité

Pour implémenter les commandes annuler/rétablir, j'ai suivi un modèle de conception commun d'objets Command à l'aide des méthodes Undo et Redo. UndoManager collecte ces objets dans une liste. Ensuite, le statut de UndoManager contrôle le statut activé/désactivé des éléments de menu (MenuItems) Annuler/Rétablir. Lorsque l'utilisateur sélectionne l'élément de menu Annuler, la méthode Undo est appelée sur la commande active, puis cette commande est envoyée à la pile Redo.

Figure 6. Undo/Redo dans une arborescence
Figure 6. Undo/Redo dans une arborescence

Certaines opérations de l'éditeur provoquent plusieurs éditions de l'arborescence, y compris l'opération replace-all (Remplacer tout) et l'édition de la valeur d'un attribut d'espace de noms. (Lorsque vous modifiez la valeur d'un attribut d'espace de noms, chaque liaison XmlNode à cet espace de noms doit être reconstruite à l'aide d'une nouvel URI d'espace de noms, ce qui peut évidemment affecter un grand nombre de nœuds dans l'arborescence !) Ainsi, pour que ces opérations se regroupent en une seule opération Undo atomique, il existe un objet CompoundCommand contenant une liste de commandes d'édition plus petites et cette CompoundCommand est placée dans UndoManager.

Parmi les objets de commande plus simples figurent les objets suivants, s'exécutant tous sur les objets XmlTreeNode et XmlNode :

Figure 7. Objets de commande dans l'arborescence
Figure 7. Objets de commande dans l'arborescence

La commande PasteCommand est spéciale, car elle retire du texte XML aléatoire du presse-papiers et l'analyse dans le contexte de l'élément actuellement sélectionné dans l'arborescence, héritant des espaces de noms environnants. La classe d'assistance TreeData utilise le constructeur spécial XmlTextReader qui prend XmlParserContext comme entrée.

Test des unités

J'ai dû réaliser un gros travail de test pour la nouvelle version de XML Notepad et je recherchais une excuse pour utiliser les nouveaux projets UnitTest de Visual Studio 2005. UnitTest s'exécute à partir de TestManager sous le nouveau menu Test à partir de Visual Studio, lance XML Notepad et exécute les 15 méthodes de test décrites précédemment.

Figure 8. UnitTests
Figure 8. UnitTests

Une fois le test terminé, vous pouvez cliquer avec le bouton droit de la souris sur la fenêtre Résultats du test (Test Results) et sélectionner « Résultats de couverture du code » (Code Coverage Results). Un résumé du nombre de blocs traités dans chaque fonction s'affiche. Vous pouvez double-cliquer sur une ligne de la liste pour afficher un code source utilisant un codage de couleur et présentant exactement les codes traités. Il est alors très facile d'obtenir une couverture de code d'environ 85 %.

Le seul problème réside dans le fait que vous n'obtenez pas de couverture de code lorsque vous exécutez les tests sous le débogueur, et le projet UnitTest crée un fichier en regard de votre solution appelé « localtestrun.testrunconfig » et « XmlNotepad.vsmdi », que vous ne devriez pas perdre. Si c'est le cas, la couverture du code ne fonctionnera pas. Ceci mis à part, je dois dire que ce nouvel outil UnitTest est l'une des nouvelles fonctionnalités les plus intéressantes de Visual Studio 2005.

Conclusion

J'espère que vous apprécierez la toute nouvelle version de XML Notepad. N'hésitez pas à nous faire part de vos commentaires et suggestions en envoyant un courrier électronique à wdxtools@microsoft.com.

© 2009 Microsoft Corporation. Tous droits réservés. Conditions d'utilisation | Marques | Confidentialité
Page view tracker