Création de services Web XML qui analysent le contenu d'une page Web
Le Web expose aujourd'hui une immense quantité d'informations. Malheureusement, la majorité de ces données n'est facilement lisible qu'à partir d'un navigateur. Les services Web XML créés à l'aide d'ASP.NET aident à améliorer cette situation en fournissant une solution d'analyse HTML qui permet aux développeurs d'analyser le contenu d'une page HTML distante et d'exposer par programme les données qui en résultent. Une fois l'autorisation obtenue de l'éditeur du contenu du site Web et en supposant que la présentation ne change pas, l'analyse HTML peut alors être utilisée pour exposer les services Web XML dont les clients peuvent tirer parti.
La création d'un service Web XML qui analyse le contenu d'une page Web fait appel à un paradigme différent de celui utilisé pour la création d'un service Web XML typique. Un service Web XML qui analyse une page HTML est implémenté par la création d'une description de service, qui est un document XML en langage WSDL (Web Services Description Language). Dans la description de service, les éléments XML sont ajoutés pour spécifier les paramètres d'entrée et les données à retourner de la page HTML analysée. La plus grande partie de l'implémentation s'effectue au niveau de la spécification des données retournées par la page HTML analysée, puisque c'est là que les instructions d'analyse du contenu HTML sont spécifiées. Afin d'ajouter ces éléments XML et donc de créer un service Web XML qui analyse une page HTML, un développeur doit comprendre la présentation d'un document XML écrit en WSDL. Pour plus d'informations sur le langage WSDL, consultez la spécification WSDL sur le site Web du W3C (www.w3.org/TR/wsdl).
Spécification des paramètres d'entrée
Les paramètres d'entrée peuvent être passés au serveur Web si la page HTML en cours d'analyse accepte les paramètres qui affectent le contenu de la page HTML retournée.
Pour spécifier des paramètres d'entrée
Ajoutez les éléments XML enfants <part> à l'élément XML <message> dans la description de service représentant l'opération <input> pour un <portType> donné.
Chaque élément enfant <part> représente un paramètre et a deux attributs : name et type. L'attribut name est le nom de paramètre et l'attribut type est le type de données du paramètre. Des types complexes peuvent être définis dans un schéma XSD, dans la section types de la description de service, puis spécifiés comme type de données pour un paramètre.
L'exemple de code suivant définit trois paramètres d'entrée nommés
param1
,param2
etparam3
dans leGetTitlesHttpGetIn
<message> pourTitlesHttpGet
<portType>.<definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://tempuri.org/" xmlns="https://schemas.xmlsoap.org/wsdl/" xmlns:myarray="http://tempuri.org/MyArrayType"> <types> <s:schema targetNamespace="http://tempuri.org/MyArrayType"> <s:complexType name="StringArray"> <s:complexContent> <s:restriction xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" base="soapenc:Array"> <s:sequence> <s:element name="String" type="s:string" minOccurs="0" maxOccurs="unbounded" /> </s:sequence> </s:restriction> </s:complexContent> </s:complexType> </s:schema> </types> <message name="GetTitlesHttpGetIn"> <part name="param1" type="s:string"/> <part name="param2" type="s:string"/> <part name="param3" type="myarray:StringArray"/> </message> <portType name="TitlesHttpGet"> <operation name="GetTitles"> <input message="s0:GetTitlesHttpGetIn"/> <output message="s0:GetTitlesHttpGetOut"/> </operation> </portType>
Spécification des données à retourner à partir de la page HTML analysée
Les données à retourner d'une page HTML analysée sont exprimées dans la description de service, à l'aide d'une série d'éléments XML contenant des expressions régulières pour analyser des éléments de données spécifiques tout en fournissant un nom à chacun d'entre eux. Au cœur de chaque élément XML match contenant les instructions d'analyse, se trouve une expression régulière .NET Framework. L'expression régulière .NET Framework fournit une notation complète des critères spéciaux vous permettant d'analyser rapidement de grandes quantités de texte afin de trouver des modèles de caractères spécifiques. Pour plus d'informations concernant la syntaxe des expressions régulières du .NET Framework, consultez Expressions régulières du .NET Framework.
Pour spécifier les données retournées à partir d'une page HTML analysée
Ajoutez un élément XML <text> qualifié par un espace de noms dans l'élément <output> de l'élément <operation> pour le <binding> souhaité.
Ajoutez les éléments XML <match> dans la description de service de l'élément XML <text> pour chaque donnée que vous souhaitez retourner à partir de la page HTML analysée.
Attribut Description name Nom de la classe ou de la propriété représentant la donnée retournée. Une classe proxy générée par l'outil Wsdl.exe associe l'attribut name à une classe, si l'élément XML <match> a des éléments enfants <match>. Les éléments <match> enfants sont mappés à des propriétés de la classe. pattern Modèle d'expression régulière à utiliser afin d'obtenir la donnée. Pour plus d'informations concernant la syntaxe des expressions régulières du .NET Framework, consultez Expressions régulières du .NET Framework. ignoreCase Spécifie si l'expression régulière doit être exécutée sans respecter la casse. La valeur par défaut respecte la casse. repeats Spécifie le nombre de valeurs que l'expression régulière doit retourner si celle-ci a plusieurs correspondances dans la page HTML. La valeur 1 retourne uniquement la première correspondance. La valeur -1 retourne toutes les correspondances. La valeur -1 équivaut à un * dans une expression régulière. La valeur par défaut est -1. group Spécifie un regroupement de correspondances associées. capture Spécifie l'index d'une correspondance dans un regroupement. type Les classes proxy générées à l'aide de Wsdl.exe utiliseront l'attribut de type comme nom de la classe retournée pour un <match> qui contient des éléments <match> enfants. Par défaut, une classe proxy générée par Wsdl.exe affectera le nom spécifié dans l'attribut name au nom de la classe retournée. L'exemple de code suivant est un exemple de page Web simple contenant les balises
<TITLE>
et<H1>
.<HTML> <HEAD> <TITLE>Sample Title</TITLE> </HEAD> <BODY> <H1>Some Heading Text</H1> </BODY> </HTML>
L'exemple de code suivant est une description de service qui analyse le contenu de la page HTML et extrait le texte qui se trouve entre les balises
<TITLE>
et<H1>
. Dans l'exemple de code, une méthodeTestHeaders
est définie pour la liaisonGetTitleHttpGet
. La méthodeTestHeaders
définit deux données que la page HTML analysée peut retourner dans les éléments XML <match> :Title
etH1
qui analysent respectivement le contenu des balises<TITLE>
et<H1>
.<?xml version="1.0"?> <definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="https://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="https://schemas.xmlsoap.org/wsdl/mime/" xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:s0="http://tempuri.org/" targetNamespace="http://tempuri.org/" xmlns="https://schemas.xmlsoap.org/wsdl/"> <types> <s:schema targetNamespace="http://tempuri.org/" attributeFormDefault="qualified" elementFormDefault="qualified"> <s:element name="TestHeaders"> <s:complexType derivedBy="restriction"/> </s:element> <s:element name="TestHeadersResult"> <s:complexType derivedBy="restriction"> <s:all> <s:element name="result" type="s:string" nullable="true"/> </s:all> </s:complexType> </s:element> <s:element name="string" type="s:string" nullable="true"/> </s:schema> </types> <message name="TestHeadersHttpGetIn"/> <message name="TestHeadersHttpGetOut"> <part name="Body" element="s0:string"/> </message> <portType name="GetTitleHttpGet"> <operation name="TestHeaders"> <input message="s0:TestHeadersHttpGetIn"/> <output message="s0:TestHeadersHttpGetOut"/> </operation> </portType> <binding name="GetTitleHttpGet" type="s0:GetTitleHttpGet"> <http:binding verb="GET"/> <operation name="TestHeaders"> <http:operation location="MatchServer.html"/> <input> <http:urlEncoded/> </input> <output> <text xmlns="https://microsoft.com/wsdl/mime/textMatching/"> <match name='Title' pattern='TITLE>(.*?)<'/> <match name='H1' pattern='H1>(.*?)<'/> </text> </output> </operation> </binding> <service name="GetTitle"> <port name="GetTitleHttpGet" binding="s0:GetTitleHttpGet"> <http:address location="https://localhost" /> </port> </service> </definitions>
L'exemple de code suivant est une partie de la classe proxy générée par Wsdl.exe pour la description de service précédente.
' GetTitle is the name of the proxy class. Public Class GetTitle Inherits HttpGetClientProtocol Public Function TestHeaders() As TestHeadersMatches Return CType(Me.Invoke("TestHeaders", (Me.Url + _ "/MatchServer.html"), New Object(-1) {}),TestHeadersMatches) End Function End Class Public Class TestHeadersMatches Public Title As String Public H1 As String End Class [C#] ' GetTitle is the name of the proxy class. public class GetTitle : HttpGetClientProtocol { public TestHeadersMatches TestHeaders() { return ((TestHeadersMatches)(this.Invoke("TestHeaders", (this.Url + "/MatchServer.html"), new object[0]))); } } public class TestHeadersMatches { public string Title; public string H1; }
Voir aussi
Expressions régulières du .NET Framework | MatchAttribute, classe | Création de services Web XML à l'aide d'ASP.NET