Meng Xianhui
En raison de la véritable indépendance de plate-forme du XML (Extensible Markup Language : eXtensible Markup Language), il devient progressivement le principal support de transmission de données. XML est un langage auto-descriptif et les données elles-mêmes contiennent déjà des métadonnées, c'est-à-dire des informations sur les données elles-mêmes. Par exemple : "Mencius Chapter E 1757281793923net_lover1807581793923" Il est difficile de voir ce qu'il signifie littéralement et de combien de segments de données il se compose. Cependant, si nous utilisons XML pour le décrire comme suit, nous peut clairement voir la signification de chaque segment de données :
<DonnéesPersonnes>
<Personne>
<Nom>Mencius Chapitre E</Nom>
<Hauteur>175</Hauteur>
<Poids>72</Poids>
<Tél>81793923</Tél>
</Personne>
<Personne>
<nom>net_lover</nom>
<Hauteur>180</Hauteur>
<Poids>75</Poids>
<Tél>81793923</Tél>
</Personne>
</PersonData>
À partir du morceau de XML ci-dessus, nous pouvons non seulement voir clairement ce que chaque donnée représente, mais également savoir où les données sont divisées. Dans nos applications habituelles, les résultats que nous obtenons peuvent se présenter sous la forme de tableaux, de collections ou de jeux d'enregistrements. Comment les convertir en données au format XML auto-descriptives ? Du point de vue du formulaire de données, XML est un format texte simple de chaînes pures. Les chaînes sont très simples, rapides et faciles à transférer. Les tableaux sont parfois très lents à transférer par référence et sont très difficiles à traiter, ainsi que les collections et l'enregistrement. les ensembles sont tous deux des objets, ce qui entraînera une diminution des performances de l'ordinateur pendant le traitement, et ces objets sont associés à une plate-forme spécifique, ce qui nécessite que la plate-forme dispose d'un mécanisme de traitement intégré pour gérer les opérations sur les objets. XML est déjà une norme du W3C et est indépendant de la plate-forme. La seule exigence pour nos ordinateurs est d'être capable de traiter des chaînes XML simples, c'est-à-dire qu'il peut analyser les chaînes XML et décomposer facilement les données via une interface. segments de données indépendants afin que nous puissions y accéder. Les analyseurs XML sont petits, performants et peuvent être trouvés sur toutes les plateformes. Une fois que nous avons reçu les données XML et les avons analysées dans le style de l'exemple ci-dessus, nous pouvons les convertir en différentes représentations via XSLT (eXstensible Stylesheet Language Transformations). L'utilisation du format de données XML pour la transmission de données rendra notre travail d'écriture de code d'application plus simple et plus facile, et offrira une bonne évolutivité.
Voyons ensuite comment convertir nos données. Notre exemple est écrit sous Microsoft Windows 2000, IIS5, MSXML3 et ADO2.6. Les exemples de données utilisent l'exemple de base de données Northwind fourni avec Microsoft SQL Server7.0. La raison pour laquelle nous utilisons SQL Server7 au lieu de SQL Server2000 qui prend en charge XML est de prendre en compte le principe d'universalité. Notre objectif est de traiter les jeux d'enregistrements obtenus à partir de différents types de sources de données, et pas seulement de prendre en charge la sortie XML comme la source de données SQL Server2000. . Utilisez ADO car il a différentes formes et peut gérer différents types de sources de données ; utilisez XML car il peut transmettre et analyser rapidement. Mais la méthode de traitement dans cet exemple convient également à tout environnement doté de l'analyseur Microsoft XML, ADO2.5 ou version supérieure de Windows, IIS, SQL Server.
Par souci de simplicité, nous sélectionnons uniquement les produits dont le prix unitaire est inférieur ou égal à 20 dollars américains, dont le stock est supérieur ou égal à 20 dollars américains, et dont le nom du produit est inférieur ou égal à 6 caractères :
<%
Dim objRecordset
Définir objRecordset = Server.CreateObject("ADODB.Recordset")
objRecordset.open _
"SELECT Nom du produit, Prix unitaire, UnitsInStock" _
& "DE PRODUITS" _
& "OÙ PrixUnité <= 20" _
& "ET UnitésEnStock >= 20 " _
& "ET LEN(NomProduit) <= 6 " _
& "COMMANDE PAR NomProduit", _
"Fournisseur=SQLOLEDB;"
& "Source de données=Un serveur SQL ;"
& "Catalogue initial=Northwind;"
& "ID utilisateur=MonNomUtilisateur;"
& "Mot de passe=MonMot de passe;"
%>
Maintenant, nous utilisons 3 méthodes pour convertir le jeu d'enregistrements que nous avons obtenu au format XML.
Tout d’abord, nous pouvons parcourir l’intégralité du jeu d’enregistrements, utiliser XML DOM (Document Object Model) et créer une arborescence de nœuds XML :
<%
Dim objXMLDOM, objRootNode, objNode
Définir objXMLDOM = Server.CreateObject("MSXML2.DOMDocument")
Définir objRootNode = objXMLDOM.createElement("xml")
objXMLDOM.documentElement = objRootNode
Faire sans objRecordset.EOF
Définir objRowNode = objXMLDOM.createElement("row")
Définir objNode = objXMLDOM.createElement("ProductName")
objNode.text = objRecordset.Fields.Item("ProductName").Value
objRowNode.appendChild(objNode)
Définir objNode = objXMLDOM.createElement("UnitPrice")
objNode.text = objRecordset.Fields.Item("UnitPrice").Value
objRowNode.appendChild(objNode)
Définir objNode = objXMLDOM.createElement("UnitsInStock")
objNode.text = objRecordset.Fields.Item("UnitsInStock").Value
objRowNode.appendChild(objNode)
objRootNode.appendChild(objRowNode)
objRecordset.MoveNext
Boucle
Définir objNode = Rien
Définir objRowNode = Rien
Définir objRootNode = Rien
Définir objRecordset = Rien
%>
Maintenant, nous avons un objet XML DOM. Les performances de cette méthode ne sont pas idéales lorsque le jeu d'enregistrements est volumineux, car l'objet jeu d'enregistrements ADO et l'objet XML DOM doivent être stockés simultanément dans la mémoire système.
La deuxième méthode consiste à parcourir le jeu d'enregistrements et à générer directement la chaîne XML elle-même :
<%
Faible strXML
strXML = "<xml>"
objRecordset.MoveFirst
Faire sans objRecordset.EOF
strXML = strXML & "<ligne>"
strXML = strXML & "<NomProduit>" _
& objRecordset.Fields.Item("ProductName").Value _
& "</ProductName>"
strXML = strXML & "<PrixUnit>" _
& objRecordset.Fields.Item("UnitPrice").Value _
& "</PrixUnité>"
strXML = strXML & "<UnitsInStock>" _
& objRecordset.Fields.Item("UnitsInStock").Value _
& "</UnitsInStock>"
strXML = strXML & "</row>"
objRecordset.MoveNext
Boucle
strXML = strXML & "</xml>"
Définir objRecordset = Rien
%>
Cependant, le plus gros défaut des deux méthodes ci-dessus est que le code ne peut pas être réutilisé. Nous avons noté les noms des nœuds. Si nous interrogeons différents champs, nous devons également modifier manuellement notre code pour répondre aux besoins des différents nœuds. Notre approche ci-dessous deviendra plus générale.
La troisième méthode : méthode réutilisable.
<%
Faible strXML
strXML = "<xml>"
objRecordset.MoveFirst
Faire sans objRecordset.EOF
strXML = strXML & "<ligne>"
Pour chaque varItem dans objRecordset.Fields
strXML = strXML _
& "<" & varItem.name & ">" _
&varItem.value_
& "</" & varItem.name & ">"
Suivant
strXML = strXML & "</row>"
objRecordset.MoveNext
Boucle
strXML = strXML & "</xml>"
Définir objRecordset = Rien
%>
Une méthode plus efficace consiste à utiliser directement la méthode de sauvegarde intégrée du jeu d'enregistrements, qui peut automatiquement convertir le contenu du jeu d'enregistrements au format XML. Après avoir appelé la méthode de sauvegarde, nous pouvons immédiatement libérer l'instance de l'objet du jeu d'enregistrements dans la mémoire. . La méthode de sauvegarde a deux paramètres : l'un est l'endroit où le XML doit être enregistré et l'autre est un indicateur indiquant le format dans lequel les données sont enregistrées. Nous pouvons enregistrer les données en tant qu'objet XML DOM (objet ADO STREAM), ou les enregistrer directement en tant qu'objet ASP RESPONSE. Par souci de généralité, nous les enregistrons en tant qu'objet XML DOM et utilisons la constante adPersistXML ADO pour le deuxième paramètre. . Voici comment procéder :
<%
Const adPersistXML = 1
Dim objXMLDOM
Définir objXMLDOM = Server.CreateObject("MSXML2.DOMDocument.3.0")
objRecordset.save objXMLDOM, adPersistXML
Définir objRecordset = Rien
%>
Cette méthode est pratique, rapide et sans erreur. Il n'est pas nécessaire de modifier manuellement le nom du nœud pour différentes requêtes. Cependant, le XML produit par cette méthode n'est pas assez concis. Jetez un œil au résultat qu'il produit :
<xml
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType
nom="ligne"
content="eltOnly"
rs:CommandTimeout="30">
<s:AttributeType
nom = "Nom du produit"
rs:numéro="1"
rs:writeunknown="true">
<s:type de données
dt:type="chaîne"
dt:maxLongueur="40"
rs:maybenull="false"/>
</s:AttributeType>
<s:AttributeType
nom="PrixUnit"
rs:numéro="2"
rs:nullable="vrai"
rs:writeunknown="true">
<s:type de données
dt:type="numéro"
rs:dbtype="devise"
dt:maxLongueur="8"
rs:précision="19"
rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType
nom="UnitésEnStock"
rs:numéro="3"
rs:nullable="vrai"
rs:writeunknown="true">
<s:type de données
dt:type="i2"
dt:maxLongueur="2"
rs:précision="5"
rs:fixedlength="true"/>
</s:AttributeType>
<s:extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row
Nom du produit="Chai"
PrixUnité="18"
UnitsInStock="39"/>
<z:ligne
Nom du produit="Konbu"
PrixUnité="6"
UnitsInStock="24"/>
<z:ligne
Nom du produit="Tofu"
PrixUnité="23,25"
UnitsInStock="35"/>
</rs:data>
</xml>
Le XML généré automatiquement par ADO contient des informations de schéma, qui décrivent quels nœuds et attributs sont autorisés dans ce XML et quels types de données sont utilisés, et les nœuds de données sont a également augmenté l'espace de noms. Les informations de schéma peuvent être utiles lorsque la validation des données est requise ou pour un traitement plus complexe, mais, dans la plupart des cas, nous utilisons des clients légers et nous n'avons pas besoin d'informations de schéma. Nous pouvons utiliser XSLT pour séparer les informations souhaitées et supprimer les informations redondantes. Par conséquent, nous écrivons le « DataCleaner.xsl » suivant :
<?xml version="1.0"?>
<xsl:version de la feuille de style="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform "
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output omit-xml-declaration="oui"/>
<xsl:template match="/">
<xsl:element name="xml">
<xsl:for-each select="/xml/rs:data/z:row">
<xsl:element name="row">
<xsl:for-each select="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:élément>
</xsl:pour-chacun>
</xsl:élément>
</xsl:pour-chacun>
</xsl:élément>
</xsl:modèle>
</xsl:feuille de style>
Ce XSLT possède des fonctionnalités réutilisables et s'applique à différents résultats de requête. Voici un exemple d'utilisation de ce XSLT :
<%
Dim strCleanXML, objXMLDOM_XSLT
Définir objXMLDOM_XSLT = CreateObject("MSXML2.DOMDocument")
objXMLDOM_XSLT.load(Server.MapPath("DataCleaner.xsl"))
strCleanXML = objXMLDOM.transformNode(objXMLDOM_XSLT)
Définir objXMLDOM = Rien
Définir objXMLDOM_XSLT = Rien
%>
Après le traitement ci-dessus, strClaenXML est la chaîne XML souhaitée.
<xml>
<ligne>
<ProductName>Chai</ProductName>
<PrixUnit>18</PrixUnit>
<UnitsInStock>39</UnitsInStock>
</ligne>
<ligne>
<ProductName>Konbu</ProductName>
<PrixUnit>6</PrixUnit>
<UnitsInStock>24</UnitsInStock>
</ligne>
</xml>
La chaîne XML dans le format ci-dessus est le style d'ensemble de nœuds que nous voyons souvent. Si vous ne souhaitez pas traiter le champ en nœud, mais le traiter en nœud d'attribut, il suffit d'apporter de légères modifications à DataCleaber. xsl :
<?xml version="1.0"?>
<xsl:version de la feuille de style="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform "
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<xsl:output omit-xml-declaration="oui"/>
<xsl:template match="/">
<xsl:element name="xml">
<xsl:for-each select="/xml/rs:data/z:row">
<xsl:element name="row">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribut>
</xsl:pour-chacun>
</xsl:élément>
</xsl:pour-chacun>
</xsl:élément>
</xsl:modèle>
</xsl:feuille de style>
Ce qui suit est le résultat de l'utilisation du nouveau style, qui est beaucoup plus court que l'utilisation de nœuds pour représenter la longueur du champ. La vitesse de transfert sera plus rapide :
<xml>
<row ProductName="Chai" UnitPrice="18" UnitsInStock="39"/>
<row ProductName="Konbu" UnitPrice="6" UnitsInStock="24"/>
</xml>
Jusqu'à présent, nous avons introduit plusieurs façons d'obtenir des données au format XML à partir des jeux d'enregistrements ADO, et nous avons également obtenu la chaîne la plus simplifiée. Mais il y a plusieurs problèmes auxquels vous devez quand même prêter attention. Certaines valeurs de champ contiennent des caractères qui ne sont pas pris en charge en XML, tels que : "'< >&, comme le nom de P&G Procter & Gamble, le nom de Produit Gumbo Mix du chef Anton, etc. Vous devez le faire lors de la conversion. Effectuer le traitement d'encodage. Il y a des problèmes à noter lors de l'utilisation de la méthode de sauvegarde dans le SDK Microsoft ADO 2.6 : 1. La méthode de sauvegarde ne fonctionne que sur les Recordset ouverts ; avec des champs de types adVariant, adIDispatch et adIUnknown ne sont pas pris en charge savw ; 3. Il existe deux limitations lors de l'enregistrement de jeux d'enregistrements hiérarchiques (formes de données) : les paramétrages et les jeux d'enregistrements contenant des mises à jour non résolues ne peuvent pas être enregistrés.
Afin d'améliorer encore les performances, vous pouvez effectuer le travail de conversion dans les composants COM/COM+, et le code ASP effectue uniquement la présentation finale des données. Séparez la couche métier, la couche de données et la couche de présentation. ASP n'a besoin que d'appeler le composant de données. Le composant de données appelle la procédure stockée de la base de données, convertit le résultat en XML et enfin renvoie uniquement la simple chaîne XML au programme ASP. , et ASP peut utiliser XSLT pour convertir le XML et envoyer le résultat au navigateur.