Utiliser XML avec Visual Basic




        Le XML prend une place de plus en plus importante dans l'industrie du logiciel. Nombreuses sont les productions professionnelles faisant appel à cette technologie. Citons par exemple Netscape 6 (et son cousin Mozilla), Open Office (ou Star Office 6)... Même le logiciel utilisé pour rédiger ce cours (NeoEZ 2.0) utilise XML et XSL. Les sites Internet également utilisent de plus en plus XML, couplé à XSL. Vous pouvez admirer le résultat d'une telle utilisation sur les sites de Microsoft ou encore sur Java Lobby.
Ce cours va vous permettre d'apprendre à manipuler des fichiers XML ainsi que des fichiers XSL au sein de Visual Basic. Vous serez de la sorte aptes à réaliser un site Web en ASP à l'aide de XML.


Sommaire

1. Introduction
2. Lecture d'un fichier XML
3. Création d'un fichier XML
4. Génération d'un fichier HTML
5. Ressources


Introduction


        Trois points seront abordés dans ces lignes:
  • Lecture d'un fichier XML (DOM et SAX)
  • Création d'un fichier XML (DOM)
  • Génération d'un fichier HTML (XML/XSL)
Les mentions DOM (Document Object Model) et SAX (Simple API for XML) désignent deux méthodes utilisées pour manipuler des documents XML.


        La méthode DOM


        La méthode DOM est réellement très simple. Son principe consiste à décrire tout document XML sous forme d'arborescence d'objets appelés Nodes. Chaque Node représente une balise du fichier XML. Un objet Node possède donc des attributs, des fils et un parent. En employant à bon escient les caractéristiques parents et enfants, on peut aisément parcourir l'ensemble du document XML.
L'avantage de la méthode DOM est sa souplesse. En effet, le programmeur n'a à traiter qu'un seul et unique type d'objet. Généralement, le document XML est créé dans un objet nommé DOMDocument. Cependant, cet objet n'est qu'un objet DOMNode. De la sorte, l'ensemble des fonctions de manipulations XML de vos programmes pourront traiter un document XML à n'importe quel niveau et ce sans aucune modification du code.


        La méthode SAX


        La méthode SAX permet d'aboutir au même résultat que la méthode DOM mais de façon très différentes. Le schéma de fonctionnement de la méthode DOM est le suivant:
  • Création de l'objet DOMDocument
  • DOMDocument.loadXML(fichier)
  • Parcours du document grâce aux Nodes
Si la gestion du document XML peut s'avérer parfois fastidieuse (il n'est pas toujours pratique de parcourir un arbre), cette méthode permet de conserver un objet contenant l'arborescence du document XML.
SAX au contraire facilite le traitement des données XML mais ne donne pas accès à un objet décrivant le document. En effet, un parser de type SAX posséde trois manipulateurs (ou handlers):
  • Contents Handler
  • DTD Handler
  • Error Handler
Chacun de ces manipulateurs correspond à une classe héritant d'une interface de type SAXHandler. Le parser, en parcourant le document XML, appellera les méthodes requises dans ces manipulateurs. La méthode SAX est donc événementielle. Prenons un exemple. Lorsque le parser rencontre une balise d'ouverture, la méthode startElement() du manipulateur SAXContentHandler est appelée. C'est pour cela que SAX est recommandé dans certains cas.


        Pour finir, voici une représentation sous forme de diagramme UML d'un document XML. Nous voyons que l'ensemble gravite autour du type XMLDocument. Ce schéma montre également la généralisation de la technologie XML.
(Note: ce schéma n'est pas exhaustif. La représentation UML est également approximative)


Lecture d'un fichier XML


        La lecture de fichiers XML au sein d'une application trouve de nombreux emplois. Il y a de nombreuses raisons à cet état de faits. La nature même des documents XML font d'eux des indispensables dès lors qu'il s'agit de représenter des arbres. Pensez aux menus d'un logiciel. Un menu possède des éléments et des sous-menus. Or, les sous-menus ne sont autres que des menus contenant des éléments et... des sous-menus ! Nous retrouvons ici la structure des Nodes évoqués plus haut. Dans cet exemplte, il apparaît clairement qu'un fichier XML peut très simplement décrire les menus d'une application.
Comme il existe deux méthodes pour lire des fichiers XML, nous allons nous pencher sur les deux. Nous commencerons par la méthode DOM qui est plus rapide à mettre en oeuvre.


        Que vous utilisiez la méthode DOM ou la méthode SAX vous aurez besoin d'installer le parser XML version 3 de Microsoft. Vous pouvez télécharger celui-ci à l'adresse suivante: http://jext.free.fr/msxml3.exe (640 ko).
Une fois l'exécutable téléchargé puis exécuté, créez un nouveau projet Visual Basic standard. Rendez-vous ensuite dans les Références du projet et cochez la case Microsoft XML, v3.0. Votre projet est maintenant en mesure d'utiliser XML.


        Lecture d'un document par la méthode DOM


        La lecture d'un fichier XML via DOM tient en quelques lignes. Extrêmement concis:


Dim doc As DOMDocument
Set doc = New DOMDocument
Call doc.Load("fichier.xml")


        Eh oui, c'est tout ! Néanmoins, vous ne possédez maintenant qu'un DOMDocument qui n'a pas été traité. Vous vous devez maintenant le manipuler à l'aide des DOMNode. Voici un exemple de code qui parcoure les noeuds enfants du noeud racine et affiche leurs noms:


' n est le noeud racine
' xNode est le noeud parcouru
Dim n As IXMLDOMNode, xNode As IXMLDOMNode

' on attribue le noeud racine
Set n = doc.documentElement

' pour chaque noeud enfant
For Each xNode In n.childNodes
  MsgBox xNode.nodeName
Next


        Un simple fonction récursive vous permettra d'afficher l'intégralité des noms des balises:


Sub main()
    Dim doc As DOMDocument
    Set doc = New DOMDocument
    doc.Load "fichier.xml"

    Dim n As IXMLDOMNode
    Set n = doc.documentElement
    Call afficheNom(n)
End Sub

Sub afficheNom(n As IXMLDOMNode)
    ' si il n'y a pas d'enfants, on quitte
    If n.childNodes.length = 0 Then Exit Sub

    Dim xNode As IXMLDOMNode
    ' pour chaque noeud enfant
    For Each xNode In n.childNodes
      MsgBox xNode.nodeName
      Call afficheNom(xNode)
    Next
End Sub


        Si vous exécutez ce petit programme vous constaterez qu'il affiche parfois des éléments nommés #text. Pourquoi cela ? Nous l'avons dit, un document XML ne contient que des noeuds. Mais un noeud peut être spécialisé. Ainsi le contenu d'une balise (par exemple <balise>contenu</balise>) est considéré comme un noeud de type #text. Pour éviter cet écueil, nous avons à notre disposition le type DOMElement (réprésenté par l'objet IXMLDOMElement) qui possède toutes les caractéristique d'un Node. Cependant, cet objet ne représente que des balises ! Ainsi vous pourrez vous affranchir des Nodes indésirables.


        Lecture d'un document par la méthode SAX


        Pour gérer un document XML en employant SAX, vous allons devoir définir deux nouvelles classes que nous appellerons MyXMLContentsHandler et MyXMLErrorHandler. Une fois ces classes créées, nous pouvons créer un parser SAX et lui assigner nos manipulateurs:


' déclarations
Dim cHandler As MyXMLContentsHandler, eHandler As MyXMLErrorHandler
Dim parser As New SAXXMLReader

' manipulateurs    
Set cHandler = New MyXMLContentsHandler
Set eHandler = New MyXMLErrorHandler

' définitions des manipulateurs
Set parser.contentHandler = cHandler
Set parser.errorHandler = eHandler

' on parcoure le document XML
Call parser.parseURL("file:/" & Replace$(sFileName, "\", "/"))

Set parser = Nothing
Set cHandler = Nothing
Set eHandler = Nothing


        Mais que font exactement nos manipulateurs ? MyXMLErrorHandler se voit sollicité dès que le parser découvre une erreur dans le fichier XML. Nous ne nous en servirons que pour afficher un message donnant les détails de l'erreur:


' affichage d'un message spécifiant la position et la nature
' de l'erreur au sein du fichier XML
Private Sub error(ByVal oLocator As _
        MSXML2.IVBSAXLocator, strErrorMessage$)
    MsgBox "Error at line " & oLocator.lineNumber & _
           ", character " & oLocator.columnNumber & _
           vbCrLf & "Message:" & vbCrLf & _
           strErrorMessage, vbExclamation
End Sub

Private Sub IVBSAXErrorHandler_error( _
        ByVal oLocator As MSXML2.IVBSAXLocator, _
        strErrorMessage$, _
        ByVal nErrorCode&)
    Call error(oLocator, strErrorMessage)
End Sub

Private Sub IVBSAXErrorHandler_fatalError( _
        ByVal oLocator As MSXML2.IVBSAXLocator, _
        strErrorMessage$, _
        ByVal nErrorCode&)
    Call error(oLocator, strErrorMessage)
End Sub

Private Sub IVBSAXErrorHandler_ignorableWarning( _
        ByVal oLocator As MSXML2.IVBSAXLocator, _
        strErrorMessage$, _
        ByVal nErrorCode&)
    Call error(oLocator, strErrorMessage)
End Sub


        Notre programme d'exemple SAX va réaliser la même chose que notre programme DOM. Voici l'implémentation du ContentsHandler correspondante:


Private Sub IVBSAXContentHandler_characters(strChars$)
End Sub

Private Property Set IVBSAXContentHandler_documentLocator( _
        ByVal RHS As MSXML2.IVBSAXLocator)
End Property

Private Sub IVBSAXContentHandler_endDocument()
End Sub

Private Sub IVBSAXContentHandler_endElement( _
        strNamespaceURI$, strLocalName$, _
        strQName$)
End Sub

Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix$)
End Sub

Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars$)
End Sub

Private Sub IVBSAXContentHandler_processingInstruction(strTarget$, _
        strData$)
End Sub

Private Sub IVBSAXContentHandler_skippedEntity(strName$)
End Sub

Private Sub IVBSAXContentHandler_startDocument()
End Sub

Private Sub IVBSAXContentHandler_startElement( _
        strNamespaceURI$, strLocalName$, _
        strQName$, _
        ByVal oAttributes As MSXML2.IVBSAXAttributes)
  ' on affiche le nom de la balise
  MsgBox strQName
End Sub

Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix$, _
        strURI$)
End Sub


        L'interface IVBSAXContentHandler possède de nombreuses méthodes pour manipuler éléments, attributs, contenus, etc... Leur utilisation s'avère fort différente à chaque implémentation... n'hésitez pas à vous entraîner.


Création d'un fichier XML


        Même si il est parfaitement possible de créer un fichier XML "à la main", c'est à dire en écrivant directement les balises dans un fichier, il existe une méthode très pratique: DOM. Et oui, encore elle ! Si DOM permet de parcourir un document XML, DOM permet également de construire ce document ! En utilisant cette métode, vos programmes pourront beaucoup plus facilement créer des documents XML en cours d'exécution.


        Avant toute chose, nous devons créer un document DOM:


Dim doc As DOMDocument
Set doc = New DOMDocument


        Le document ainsi déclaré est vide. Avant de pouvoir lui ajouter des éléments, nous devons créer l'élément racine. La méthode la plus simple consiste à faire appel à la fonction loadXML qui permet de créer un document XML depuis une chaîne de caractères:


' création de l'élément racine
Call doc.loadXML("<root></root>")


        Imaginons que nous voulions maintenant ajouter une balise nommée enfant. Voici le code correspondant:


' déclaration de l'élément
Dim xmlNode As IXMLDOMNode
' création de la balise
Set xmlNode = doc.createElement("enfant")
' ajout au document
Call doc.appendChild(xmlNode)


        Notre document contient maintenant ceci:


<root>
  <enfant />
</root>


        Vous pouvez le constater, l'élément enfant ne contient rien. Il est possible de lui ajouter des balises filles, de la même manière que nous venons de le faire avec le document, ou de lui donner un contenu. Pour ajouter un contenu, insérez la ligne suivante dans le code précédent, just avant l'appel à appendChild:


' la balise enfant contient le texte: Aragorn
xmlNode.text = "Aragorn"


        Les balises peuvent posséder des attributs. Dans notre exemple, nous allons ajouter l'attribut age à la balise enfant:


' déclaration du noeud attribut
Dim xmlAttribute As IXMLDOMNode

' création de l'attribut
Set xmlAttribute = doc.createAttribute("name")
' l'attribut à pour valeur 6
xmlAttributeNode.text = "6"
' on donne l'attribut à l'élément
Call xmlNode.attributes.setNamedItem(xmlAttribute)


        Eh oui, un attribut est également un Node ! Les quelques lignes de code que nous avons écrites nous donnent le document XML suivant:


<root>
  <enfant age="6">Aragorn</enfant>
</root>


        Les Nodes possédent de nombreuses méthodes et fonctions toutes plus utiles les unes que les autres. Notons surtout la présence de la méthode save dans l'objet DOMDocument qui permet de sauvegarder le contenu du document dans un fichier.


Génération d'un fichier HTML


        La génération d'un fichier HTML depuis un fichier XML nécessite l'emploi d'une feuille de style XSL. Nous ne développerons pas le sujet des feuilles de styles XSL dans ce cours-ci. Mais nous allons voir comment réaliser la transformation. Et comme vous le verrez, à l'aide de DOM, ceci est très simple.


        Le principe de la transformation est de charger deux DOMDocument. L'un contenant le fichier XML source et le second la feuille de style. Ensuite, un simple appel à la méthode transformNode du document XML permettra la génération du code HTML:


' fichier XML
Dim doc As DOMDocument
Set doc = New DOMDocument
Call doc.load("fichier.xml")

' feuille de style XSL
Dim sheet As DOMDocument
Set sheet = New DOMDocument
Call sheet.Load("stylesheet.xsl")

Dim output$
' transformation
' s'applique sur le noeud racine du document
' en utilisant le noeud racine de la feuille XSL
output = doc.transformNode(sheet.documentElement)

' enregistrement dans un fichier
Open sFileName For Output As #1
    Print #1, output
Close #1


        La simplicité de l'opération à de quoi étonner, ne trouvez-vous pas ? Si vous étudiez les méthodes des Nodes vous constaterez que ceux-ci proposent la méthode transformNode. Cela signifie que vous pouvez transformer en HTML n'importe quelle partie d'un document XML.


Ressources


        Les technologies XML et XSL sont très vastes et pas toujours faciles à appréhender. Voici quelques liens pour vous guider:
  • Editeur XML/XSL de très bonne qualité: XML Cooktop
  • Code source du logiciel ayant créé ce cours: NeoEZ 2.0
  • Code source d'un autre logiciel VB utilisant XML: Syxigh 2.0
  • Références XML et XSL: W3C


[ Précédent | Index | Suivant ]



par Romain Guy
guy.romain@bigfoot.com
http://www.jext.org/
Dernière mise à jour: