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. |
Sommaire1. Introduction
5. Ressources
|
Introduction |
Trois
points seront abordés dans ces lignes:
|
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:
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):
|
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:
|
par Romain Guy guy.romain@bigfoot.com http://www.jext.org/ Dernière mise à jour: |