Le langage ADO (ActiveX Data Objects) possède la capacité de rendre persistant des jeux d'enregistrements au format XML dans divers récepteurs tels qu'un fichier, un flux de données, un objet ASP Response ou même un objet DOM.

Ainsi, des informations provenant de différentes sources de données peuvent être manipulées par ADO, puis enregistrer directement dans un fichier XML.

Const adPersistXML = 1
Set Objet_Recordset = Server.CreateObject("ADODB.Recordset")
Objet_Recordset.Open Source_Donnee, Chaine_Connection
Objet_Recordset.Save adresse_fichier.xml, adPersistXML

Il est également possible de conserver un objet Recordset dans un flux de données Stream.

Set Objet_Stream = Server.CreateObject("ADODB.Stream")
Objet_Recordset.Save Objet_Stream, adPersistXML

Une autre possibilité permet de retourner directement dans une page Web, un ilôt de données (Data Islands) XML, en utilisant l'objet ASP Response à la place de la source de données dans la méthode Save de l'objet Recordset.

Objet_Recordset.Save Response, adPersisXML

Néanmoins, il ne faut pas oublier d'encadrer le script ASP d'insertion par le balisage spécifique aux ilôts de données.

<XML id="Identificateur">
  <% 'Script d'insertion %>
</XML>

D'autre part, le prologue d'un document XML ne doit pas apparaître au sein de l'ilôt de données. En conséquence, les déclarations XML et de type de document ainsi que les instructions de traîtement doivent être éliminer avant l'insertion des données dans l'ilôt XML.

<?xml version="1.0" encoding="encodage" standalone="yes|no"?>
<!DOCTYPE racine SYSTEM "definition.dtd">
<?xml-stylesheet type="text/xsl" href="style.xsl"?>

En outre, le langage ADO est capable de sauvegarder des jeux d'enregistrements dans un objet DOMDocument, à partir duquel pourra se réaliser la manipulation des données XML.

Set Objet_Document = _
             Server.CreateObject("Msxml2.DOMDocument")
Objet_Recordset.Save Objet_Document, adPersistXML

L'objet Stream permet de rendre un jeu d'enregistrements persistant de la même façon qu'un Recordset.

  • La méthode SaveToFile sauvegarde un flux de données XML dans un fichier.
    Objet_Stream.SaveToFile _
                          adresse_fichier.xml, SaveOptionsEnum
  • La méthode ReadText remplit une variable par une chaîne de caractères XML pouvant ensuite être utilisée pour un traîtement ultérieur.
    variable = Objet_Stream.ReadText(adReadAll)
  • La méthode CopyTo recopie le flux XML dans un autre objet Stream.
    Objet_Stream.CopyTo Autre_Stream, -1
Exemple avec Recordset [voir]
Fichier : response.asp
<%@ LANGUAGE=VBSCRIPT %>
<!-- METADATA type="typelib"
       FILE="C:Program FilesFichiers communsSystemadomsado15.dll" -->
<%
  Dim Objet_Connection
  Dim Objet_Recordset
  Dim Chaine_connexion

  Response.ContentType = "text/xml"

  Chaine_connexion = "Provider=SQLOLEDB; Data Source="& _
                 Request.ServerVariables("SERVER_NAME") & _
                 "; Initial Catalog=pubs; User ID=sa; Password=xxx"

  Set Objet_Connection = Server.CreateObject("ADODB.Connection")
  Objet_Connection.Open Chaine_connexion
  Requete_SQL = "SELECT emp_id, fname, lname, hire_date FROM employee"

  Set Objet_Recordset = Objet_Connection.Execute(Requete_SQL)

  Objet_Recordset.Save Response, adPersistXML
%>
Fichier : ilot_response.asp
<html>
  <body>
    <XML id="employee" src="response.asp"></XML>

    <table border="0" bgcolor="#000000" datasrc="#employee">
      <tr>
        <td>
          <table border="0" bgcolor="#FFFFFF"
                      datasrc="#employee" datafld="rs:data">
            <tr>
              <td>
                <table border="1">
                  <tr>
                    <th width="120">Identificateur</th>
                    <th width="100">Nom</th>
                    <th width="100">Prénom</th>
                    <th width="200">Date d'entrée</th>
                  </tr>
                </table>
              </td>
            </tr>
            <tr>
              <td>
                <table border="1"
                            datasrc="#employee" datafld="rs:data.z:row">
                  <tr>
                    <th width="120" align="left">
                      <span datafld="emp_id"></span>
                    </th>
                    <td width="100">
                      <span datafld="fname"></span>
                    </td>
                    <td width="100">
                      <span datafld="lname"></span>
                    </td>
                    <td width="200">
                      <span datafld="hire_date"></span>
                    </td>
                  </tr>
                </table>
              </td>
            </tr>
          </table>
        </td>
      <tr>
    </table>
  </body>
</html>
Exemple avec Stream [voir]
<%@ Language=VBScript %>
<!-- #include file="adovbs.inc" -->
<html>
  <body>
    <%
      Dim Objet_Stream
      Dim Contenu_XML, Resultat
      Dim fichier

      Set Objet_Stream = Server.CreateObject("ADODB.Stream")
      Objet_Stream.Charset = "Windows-1252"
      Objet_Stream.Open
      fichier = Server.mapPath("recueil.xml")
      Objet_Stream.LoadFromFile fichier
      Contenu_XML = Objet_Stream.ReadText(adReadAll)

      prologue = "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
      Resultat = Replace(Contenu_XML, prologue, "<XML id=""ilot_donnee"">")
      Resultat = Resultat & "</XML>"

      Objet_Stream.Close
      Set Objet_Stream = Nothing
    %>
    <%= Resultat %>
    <h2>Le document HTML contient un ilôt XML contenant les
             données du fichier situé à l'adresse suivante :</h2>
    <blockquote><%= fichier %></blockquote>
    <p>Pour voir l'ilôt, affichez le menu contextuel 
           et cliquez sur <i>Afficher la source</i>.</p>
  </body>
</html>
Exemple avec DOMDocument [voir]
<%@ LANGUAGE=VBSCRIPT %>
<!-- METADATA type="typelib"
  FILE="C:Program FilesFichiers communsSystemadomsado15.dll" -->
<html>
  <head>
    <%
      Dim Objet_Connection
      Dim Objet_Recordset
      Dim Chaine_connexion
      Dim Requete_SQL
      Dim Objet_Document
      Dim affichage

      Set Objet_Document = Server.CreateObject("MSXML2.DOMDocument")

      Chaine_connexion = "Provider=SQLOLEDB; Data Source="& _
                     Request.ServerVariables("SERVER_NAME") & _
                     "; Initial Catalog=pubs; User ID=sa; " & _
                     "Password="Requete_SQL = "SELECT * FROM employee"

      Set Objet_Connection = Server.CreateObject("ADODB.Connection")
      Objet_Connection.Open Chaine_connexion

      Set Objet_Recordset = Objet_Connection.Execute(Requete_SQL)

      Objet_Recordset.Save Objet_Document, adPersistXML

      affichage = Visualise_Noeud(Objet_Document, 0)

      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
    %>
  </head>
  <body>
    <div><%= affichage %></div>
  </body>
</html>