Les interfaces du modèle d'objets de document XML, possèdent chacune certaines caractèristiques propres à elles-mêmes et extractibles par l'intermédiaire de propriétés adéquates.
Tout d'abord, le nom de l'objet en cours peut être récupéré par l'intermédiaire de la propriété nodeName applicable à tous les noeuds et plus spécifiquement pour les éléments tagName.
Nom_Noeud = Objet.nodeName Nom_Noeud = Objet_Element.tagName
Les propriétés nodetype et nodeTypeString retournent le type du noeud en cours respectivement sous forme d'un nombre entier et d'une chaîne de caractères.
Type_Valeur = Objet_Noeud.nodeType Type_Chaine = Objet_Noeud.nodeTypeString
Ce genre de fonctionnalités permet de construire des programmes conditionnels en fonction du noeud rencontré. Par exemple, un noeud textuel ne peut contenir d'autres noeuds, donc dans le cadre du parcours automatique d'une arborescence, il serait inutile de tester la présence d'enfants. De même, la détection d'un noeud précis, comme une instruction de traitement peut se faire par l'intermédiaire d'une condition If comprise dans une boucle.
Les types de noeudsFor Each Objet_Noeud In Liste_Noeuds Dim Tampon If Objet_Noeud.nodeType = 7 Then Tampon = Tampon & Objet_Noeud.value End If Next
| Type (num - chaîne) | Description |
|---|---|
| NODE_ELEMENT (1 - element) |
Noeud élément. |
| NODE_ATTRIBUTE (2 - attribute) |
Noeud attribut. |
| NODE_TEXT (3 - text) |
Noeud textuel. |
| NODE_CDATA_SECTION (4 - cdatasection) |
Noeud section CDATA. |
| NODE_ENTITY_REFERENCE (5 - entityreference) |
Noeud référence d'entité. |
| NODE_ENTITY (6 - entity) |
Noeud entité. |
(7 - processinginstruction) |
Noeud instruction de traîtement. |
| NODE_COMMENT (8 - comment) |
Noeud commentaire. |
| NODE_DOCUMENT (9 - document) |
Noeud racine. |
| NODE_DOCUMENT_TYPE (10 - documenttype) |
Noeud de définiton de type de document. |
| NODE_DOCUMENT_FRAGMENT (11 - documentfragment) |
Noeud fragment de document. |
| NODE_NOTATION (12 - notation) |
Noeud notation. |
Par ailleurs, La méthode de noeuds hasChildNodes détermine si l'objet en cours contient une descendance.
True | False = Objet.hasChildNodes
La propriété length renvoie le nombre de noeuds à l'intérieur d'une collection.
Nombre_Items = Collection_Objets.length
Ces deux dernières propriétés peuvent servir à construire une structure conditionnelle déterminant si le'objet en cours possède des noeuds enfants ainsi que leur nombre.
If Objet.hasChildNodes Then
For i = 0 To Objet.ChildNodes.length - 1
Set Noeud = Objet.ChildNodes.item(i)
Response.write "<h2>Noeuds Enfants</h2>"
& "Nom : " & Noeud.nodeName _
& "Valeur : " & Noeud.value _
& "Type : " & Noeud.nodeTypeString
Next
Else
Response.write "Nom : " & Objet.nodeName _
& "Valeur : " & Objet.value _
& "Type : " & Objet.nodeTypeString
End If
La propriété value retourne la valeur contenue au sein du noeud courant.
Valeur = Objet_Noeud.value
la propriété nodeTypedValue contient la valeur du noeud courant exprimée dans un type de donnée précisé en l'occurrence par la propriété dataType.
Objet_Noeud.dataType = Type Valeur = Objet_Noeud.nodeTypedValue
La méthode getAttribute extrait une valeur d'attribut par l'intermédiaire de son nom.
Valeur = Objet_Element.getAttribute(Nom)
Plusieurs méthodes ou propriété existent dans le DOM XML afin de récupérer des chaînes de caractères sur des noeuds.
Lorsque la propriété text est utilisée pour récupérer le contenu textuel d'un noeud, le résultat comprend non seulement la chaîne de caractères dans le noeud courant mais également celles dans les noeuds descendants.
<?xml version="1.0"?> <racine attribut="valeur racine"> Texte libre <element attribut_2="valeur attribut_2"> Valeur de l'élément </element> <(CDATA[Texte CDATA]]> <element_2> Valeur du deuxième élément </element_2> </racine> Response.Write Objet_Document.text ' Retourne Texte libre Valeur de l'élément Texte CDATA Valeur du deuxième élément
En définitive, seules les valeurs textuelles des éléments et des sections CDATA sont prises en compte, toutes les autres sont ignorées, comme les attributs, les commentaires et les instructions de traitement.
La propriété data récupère les données textuelles des noeuds CharacterData, Comment, Text ou ProcessingInstruction.
Chaine_Caracteres = Objet_Texte.data
La méthode splitText découpe un noeud textuel en deux à la position indiquée et insère le nouveau frère immédiatement après le noeud amputé.
Set Nouveau_Noeud = Noeud_Texte.splitText(Position)
La méthode subStringData récupére un intervalle de la valeur de chaîne de caractères d'un noeud textuel. La sous-chaîne est extraite à partir d'une position et jusqu'à un nombre indiqué.
Texte = Noeud_Texte.substringData(Position, Nombre)
La propriété length appliquée à un noeud textuel retourne le nombre total de caractères.
Exemple [voir]Nombre_Caractères = Objet_Texte.length
<html><body>
<%
Dim Objet_Document
Dim racine, Objet_CDATA, Noeud_Frere
Set Objet_Document = Server.CreateObject("MSXML2.DOMDocument")
fichier = Server.MapPath("livre.xml")
Objet_Document.async = false
Objet_Document.load fichier
Set racine = Objet_Document.documentElement
Response.Write "<h1>La collection comprend " & racine.childNodes.length _
& " livres.</h1><hr>"
affichage = Visualise_Noeud(Objet_Document, 0) & "<hr>" _
& "<h2>Le document a été modifié</h2>" & ajout()
Function Visualise_Noeud(Objet_Noeud, nb_espaces)
Dim resultat, i, nombre, nb_noeuds, Objet_Node
resultat = ""
For i = 1 To nb_espaces
resultat = resultat & " "
Next
resultat = resultat & "<b style='color: blue; font-weight: bold'>" _
& Objet_Noeud.nodeName _
& "</b>(" & Objet_Noeud.nodeTypeString & ") : " _
& Objet_Noeud.nodeValue
If Objet_Noeud.nodeType = 1 Then
If Objet_Noeud.attributes.Length Then
For Each Attribut In Objet_Noeud.attributes
resultat = resultat & "[ <b>" & Attribut.nodeName _
& "</b>(" & Attribut.nodeTypeString & ") : " _
& Attribut.nodeValue & " ]<br>"
Next
Else
resultat = resultat & "<br>"
End If
Else
resultat = resultat & "<br>"
End If
nb_noeuds = Objet_Noeud.childNodes.length
For nombre = 0 To nb_noeuds - 1
Set Objet_Node = Objet_Noeud.childNodes(nombre)
resultat = resultat & Visualise_Noeud(Objet_Node, nb_espaces + 2)
Next
Visualise_Noeud = resultat
End Function
Function ajout()
Set Objet_Node = Objet_Document.selectSingleNode _
("//livre[nom = ""ASP, ADO, and XML Complete""]")
Set Objet_CDATA = Objet_Document.createCDATASection(" " _
& "<p>Un livre de <b>Kurt Gagle</b>," _
& " auteur également de...</p>")
Objet_Node.insertBefore Objet_CDATA, Objet_Node.firstChild
Set Noeud_frere = Objet_Node.childNodes.item(1)
modification = modification & "<u>La section CDATA suivante a " _
& "été ajoutée avant le noeud <b>" _
& Noeud_Frere.NodeName & " (" & Noeud_Frere.text _
& ")</b> :</u>" & Objet_CDATA.text
Set Objet_Node = Nothing
Set Noeud_Frere = Nothing
Set Objet_Node = Objet_Document.selectSingleNode _
("//livre[nom = ""XSLT Programmer's reference""]")
Set Nouvel_Objet_CDATA = Objet_CDATA.cloneNode(true)
Nouvel_Objet_CDATA.replaceData 19, 10, "Michael Kay"
Nouvel_Objet_CDATA.replaceData 43, 12, "de nombreux ouvrages"
Set Noeud_frere = Objet_Node.childNodes.item(1)
Objet_Node.insertBefore Nouvel_Objet_CDATA, Objet_Node.firstChild
Set Noeud_frere = Objet_Node.childNodes.item(1)
modification = modification & "<u>La section CDATA suivante a " _
& "été ajoutée avant le noeud <b>" _
& Noeud_Frere.NodeName & " (" & Noeud_Frere.text _
& ")</b> :</u>" & Nouvel_Objet_CDATA.text
Set Objet_Node = Nothing
Set Noeud_Frere = Nothing
Set oLivre4 = Objet_Document.selectSingleNode("//livre[3]/nom")
Set Objet_Node = Objet_Document.selectSingleNode _
("//livre[nom = ""Mastering Active Server Pages 3""]")
Set Nouvel_Objet_CDATA = Objet_CDATA.cloneNode(true)
Nouvel_Objet_CDATA.replaceData 19, 10, "Russell Jones"
Nouvel_Objet_CDATA.replaceData 45, Nouvel_Objet_CDATA.length, _
"du livre " & oLivre4.text & "."
Set Noeud_frere = Objet_Node.childNodes.item(1)
Objet_Node.insertBefore Nouvel_Objet_CDATA, Objet_Node.firstChild
Set Noeud_frere = Objet_Node.childNodes.item(1)
modification = modification & "<u>La section CDATA suivante a " _
& "été ajoutée avant le noeud <b>" _
& Noeud_Frere.NodeName & " (" & Noeud_Frere.text _
& ")</b> :</u>" & Nouvel_Objet_CDATA.text
ajout = modification
End Function
Objet_Document.save(Server.MapPath("livre.xml"))
affichage2 = Visualise_Noeud(Objet_Document, 0)
Set Objet_Node = Nothing
Set Noeud_Frere = Nothing
Set Objet_Document = Nothing
%>
<div><%= affichage %></div>
<hr>
<div><%= affichage2 %></div>
</body></html> |