Partager via


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 et param3 dans le GetTitlesHttpGetIn <message> pour TitlesHttpGet <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

  1. 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é.

  2. 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éthode TestHeaders est définie pour la liaison GetTitleHttpGet. La méthode TestHeaders définit deux données que la page HTML analysée peut retourner dans les éléments XML <match> : Title et H1 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&gt;(.*?)&lt;'/>          <match name='H1' pattern='H1&gt;(.*?)&lt;'/>         </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