Conversion ADO vers XML 

 

La première version est toujours visible à l'adresse http://guimberteau.name/ado2xml.inc. Elle produisait une chaîne de caractères par concaténation, ce qui était assez lourd. La nouvelle version dont voici des extraits travaille avec SAX et l'objet MXXMLWriter. Le résultat produit est directement utilisable, c'est un objet DomDocument. De plus, le traitement est bien plus rapide.

La même chose avec .NET

Le RecordSet ADO :

Code extrait de SUBJECT1.ASP


  SQL="select distinct" & _
      " S1.SUBJECT as SUBJECT1," & _
      " count(*) as I " & _
      "from" & _
      " BOOKMARK B," & _
      " SUBJECT1 S1 " & _
      "where" & _
      " PUB=2 and" & _
      " B.S1=S1.S1 and" & _
      " S1.SUBJECT<>'' " & _
      "group by" & _
      " S1.SUBJECT " & _
      "order by" & _
       S1.SUBJECT"

 

Le code de conversion :

Code extrait de ADO2XML.ASP


  <%

    SUB Ado2xml

      Set oXMLD = CreateObject("Microsoft.XMLDOM")

      Set oXMLW = CreateObject("MSXML2.MXXMLWriter")
      oXMLW.encoding = "windows-1252"
      oXMLW.indent = True
      oXMLW.output = oXMLD

      oXMLW.startDocument

      oXMLW.startElement "","","Records",Nothing

      Call OuvreRS ' Ouverture du RecordSet

      ' Pour chaque enregistrement, un element Record

      While Not oRS.Eof

        oXMLW.startElement "","","Record",Nothing

        ' Pour chaque champ, un element de même nom

        For I = 0 to oRS.Fields.Count-1

          NAME = Proper(oRS.Fields(I).Name) ' Mise au propre du nom

          oXMLW.startElement "","",NAME,Nothing
          oXMLW.characters Trim(oRS(NAME))
          oXMLW.endElement "","",NAME

        Next

        oXMLW.endElement "","","Record"

        oRS.MoveNext

      Wend

      Call FermeRS ' Fermeture du RecordSet

      oXMLW.endElement "","","Records"

      oXMLW.endDocument

      Set oXMLW = Nothing

    End SUB

    ' Mise au propre du nom

    Function Proper(N)

      Proper = UCase(Left(N,1))+LCase(Mid(N,2))

    End Function

  %>

 

Le résultat :


  <?xml version="1.0" encoding="windows-1252" standalone="no"?>
  <Records>
    <Record>
      <Subject1>Annuaires</Subject1>
      <I>40</I>
    </Record>
    <Record>
      <Subject1>Certification</Subject1>
      <I>63</I>
    </Record>

    ...

    <Record>
      <Subject1>Windows nt</Subject1>
      <I>65</I>
    </Record>
    <Record>
      <Subject1>Windows xp</Subject1>
      <I>142</I>
    </Record>
  </Records>

 

Que faire du résultat :

Sauvegarde sur disque


  oXMLD.Save "subject1.xml"

Renvoi au client au format XML


  Response.Buffer = False
  Response.Charset = "windows-1252"
  Response.ContentType = "text/xml"
  oXMLD.Save Response
  Session.Abandon

Transformation et renvoi du résultat


  Set oXMLS = CreateObject("Microsoft.XMLDOM")
  oXMLS.Async = False
  oXMLS.Load(Server.MapPath("subject1.xsl"))
  Response.Write oXMLD.TransformNode(oXMLS)
  Response.Flush

© Alain Guimberteau