I. Création d'un fichier XML▲
Un fichier Xml doit être écrit selon un schéma bien défini, nous allons donc définir la structure de notre fichier suivant ce schéma : pour créer un fichier xml standard à la syndication de contenu au format rss, voir les références en fin d'article
<lstSite>
<SITE>
<URL>
http://www.peuw.net/index.xml</URL>
<NOM>
peuw.net</NOM>
</SITE>
<SITE>
<URL>
http://www.poxx.net/index.xml</URL>
<NOM>
poxx - Science Fair</NOM>
</SITE>
</lstSite>
Imports System.Xml
Nous allons donc déclarer l'objet XmlDoc représentant notre document avec la classe XmlDocument.
'création d'une nouvelle instance du membre xmldocument
Dim
XmlDoc As
XmlDocument =
New
XmlDocument
(
)
Puis nous allons tout créer et baliser un document vierge de par la propriété LoadXml (crée un document suivant le code passé en paramètre) du XmlDocument.
'création du document
XmlDoc.LoadXml("[lstSite][/lstSite]")
Ensuite pour chacun des flux, nous allons créer une balise [SITE][/SITE] qui contiendra une balise [URL][/URL] et une balise [NOM][/NOM].
Chaque flux est représenté par un élément (classe XmlElement), nous devons donc les déclarer.
À savoir :
Dim
elemSite As
XmlElement 'ElemSite pour le nœud [SITE][/SITE]
Dim
elemUrl As
XmlElement 'ElemSite pour le nœud [URL][/URL]
Dim
elemNom As
XmlElement 'ElemSite pour le nœud [NOM][/NOM]
Pour créer nos balises, regardons de plus près les propriétés de la classe XmlElement qui nous seront utiles, à savoir :
.CreateElement : pour créer un nouveau nœud (une nouvelle balise) ;
.InnerText : pour définir la valeur de la balise (nœud) ;
.AppendChild : pour ajouter le nœud à notre document (à la fin de la liste des enfants de ce nœud).
I-A. Le principe en six points▲
1) Créons d'abord notre balise [SITE][/SITE] qui est en fait le nœud parent des balises [URL][/URL] et [NOM][/NOM] et le nœud enfant de la balise [lstSite][/lstSite]).
'creation de la balise [SITE][/SITE]
elemSite =
XmlDoc.CreateElement
(
"SITE"
)
2) Créons ensuite nos balises [URL][/URL] et [NOM][/NOM]
elemUrl =
XmlDoc.CreateElement
(
"URL"
)
elemNom =
XmlDoc.CreateElement
(
"NOM"
)
3) Définissons les valeurs de nos balises [URL][/URL] et [NOM][/NOM]
elemUrl.InnerText
=
" http://www.peuw.net/index.xml "
elemNom.InnerText
=
" peuw.net "
4) Ajoutons les balises enfants à la balise parent :
elemSite.AppendChild
(
elemUrl)
elemSite.AppendChild
(
elemNom)
5) Ajoutons la balise parent au document Xml
'on ajoute la balise parent au document
XmlDoc.DocumentElement.AppendChild
(
elemSite)
6) Écrivons le schéma Xml
I-B. Code source▲
XmlDoc.Save
(
Application.StartupPath
&
"Newsite.XML"
)
Résumé du code
Dim
elemSite As
XmlElement
elemSite =
XmlDoc.CreateElement
(
"SITE"
)
'creation et definition de la balise url (enfant)
Dim
elemUrl As
XmlElement
elemUrl =
XmlDoc.CreateElement
(
"URL"
)
elemUrl.InnerText
=
" http://www.peuw.net/index.xml "
'creation et definition de la balise Nom (enfant)
Dim
elemNom As
XmlElement
elemNom =
XmlDoc.CreateElement
(
"NOM"
)
elemNom.InnerText
=
peuw.net
'ajout des 2 balises enfants a la balise parent
elemSite.AppendChild
(
elemUrl)
elemSite.AppendChild
(
elemNom)
'on ajoute la balise parent au document
XmlDoc.DocumentElement.AppendChild
(
elemSite)
'Ecriture du Xml
XmlDoc.Save
(
Application.StartupPath
&
"Newsite.XML"
)
MsgBox
(
"Enregistrement réussi"
)
II. Lecture d'un fichier XML▲
Il est très aisé de lire un fichier Xml dont nous connaissons la structure.
La première chose à faire est de déclarer l'objet qui va contenir les données du fichier.
Les fichiers Xml ont un schéma bien défini et pour pouvoir le lire, nous devons nous servir du membre XmlDocument dépendant de la classe System.Xml.
'creation d'une nouvelle instance du membre xmldocument
Dim
XmlDoc As
XmlDocument =
New
XmlDocument
(
)
L'instruction Load nous permet de charger les données du document Xml dans l'objet XmlDoc déclarer précédemment pour nous permettre de le lire.
XmlDoc.Load
(
Application.StartupPath
&
"Newsite.XML"
)
II-A. Extraction des données▲
Exemple de la structure de notre fichier XML :
<lstSite>
<SITE>
<URL>
http://www.peuw.net/index.xml</URL>
<NOM>
peuw.net</NOM>
</SITE>
<SITE>
<URL>
http://www.poxx.net/index.xml</URL>
<NOM>
poxx - Science Fair</NOM>
</SITE>
</lstSite>
Notre but est de récupérer les nœuds enfants [URL] [/URL] et [NOM][/NOM] des nœuds parents [SITE][/SITE] pour pouvoir lire leur valeur.
Intéressons-nous à la propriété DocumentElement qui représente la racine de l'arbre et qui grâce à sa méthode GetElementsByTagName va nous permettre de retourner sous forme de liste (XMLNodeList) tous les nœuds portant le nom passé en paramètre (dans notre cas « site »).
Exemple
Dim
element As
XmlNodeList
element =
XmlDoc.DocumentElement.GetElementsByTagName
(
"SITE"
)
Maintenant que nous avons notre liste (element (XmlNodeList)) de nœuds « parents » ; il nous reste plus qu'à récupérer tous les nœuds enfants.
element contient donc la liste de toutes les balises [SITE][/SITE], chaque balise étant représenté par un nœud.
Chaque nœud parent et enfant représente un XmlNode qu'il faut déclarer.
Dim
noeud, noeudEnf As
XmlNode
II-B. Le principe en cinq points▲
Pour lire les nœuds enfants, nous utiliserons la propriété ChildNodes qui nous retourne pour le nœud sélectionné la liste de ses nœuds enfants sous forme de XmlNode.
il ne nous reste plus qu'à vérifier sur quel nœud on se trouve pour récupérer sa valeur et la traiter.
On va donc :
- parcourir un a un tous les nœuds « parent » (nœud) compris dans la liste element ;
- pour chacun de ces nœuds, récupérer la liste des nœuds « enfants » (nœudEnf) ;
- parcourir un à un tous les nœuds enfants (nœudEnf) contenus dans cette liste ;
- récupérer grâce à la propriété LocalName le nom de la balise du nœud « enfant » sélectionné ;
- récupérer le contenu de la balise à l'aide de la propriété InnerText.
II-C. Code source▲
For
Each
noeud In
element
For
Each
noeudEnf In
noeud.ChildNodes
If
noeudEnf.LocalName
=
"URL"
Then
UrlSite =
noeudEnf.InnerText
Else
If
(
noeudEnf.LocalName
=
"NOM"
) Then
NomSite =
noeudEnf.InnerText
End
If
End
If
Msgbox
(
Nomsite &
" à "
&
UrlSite)
Next
Next