Compartir a través de


Crear servicios Web XML que analicen el contenido de una página Web

La cantidad de información que se expone actualmente en el Web es ingente. Desafortunadamente, la mayor parte de estos datos sólo los puede interpretar de forma sencilla una persona que los lea en un explorador. Los servicios Web XML creados mediante ASP.NET mejoran esta situación al proporcionar una solución de análisis de HTML que permite a los programadores analizar el contenido de una página HTML remota y exponer los datos resultantes mediante programación. Después de obtener el permiso del editor del contenido del sitio Web, y suponiendo que su diseño no cambie, se puede utilizar el análisis de HTML para exponer servicios Web XML que los clientes pueden aprovechar.

En la creación de un servicio Web XML que analice el contenido de una página Web se utiliza un paradigma diferente que en la creación de un servicio Web XML típico. Un servicio Web XML que analice una página HTML se implementa mediante la creación de la descripción de un servicio, que es un documento XML escrito en Lenguaje de descripción de servicios Web (WSDL). En la descripción del servicio se agregan elementos XML para especificar los parámetros de entrada y los datos que se devolverán en la página HTML analizada. La mayor parte de la implementación consiste en especificar los datos devueltos por la página HTML analizada, puesto que es donde se especifican las instrucciones para analizar el contenido HTML. Con el fin de agregar estos elementos XML y crear así un servicio Web XML que analice una página HTML, el programador debe tener conocimientos del diseño de un documento XML escrito en lenguaje WSDL. Para obtener más información acerca de WSDL, vea la especificación de WSDL en el sitio Web de W3C (World Wide Web Consortium), en http://www.w3.org/TR/wsdl.

Especificar parámetros de entrada

Se pueden pasar parámetros de entrada al servidor Web si la página HTML que se va a analizar acepta parámetros que afectan al contenido de la página HTML devuelta.

Para especificar parámetros de entrada

  • Agregue elementos XML secundarios <part> al elemento XML <message> en la descripción de servicio que represente la operación <input> de un elemento <portType> determinado.

    Cada elemento secundario <part> representa un parámetro y tiene dos atributos: name y type. El atributo name corresponde al nombre del parámetro y el atributo type corresponde al tipo de datos del parámetro. En un esquema XSD se pueden definir tipos complejos en la sección types de la descripción de servicio y, después, se pueden especificar como el tipo de datos de un parámetro.

    En el ejemplo de código siguiente se definen tres parámetros de entrada, denominados param1, param2 y param3, dentro del elemento <message> denominado GetTitlesHttpGetIn para el elemento <portType> denominado TitlesHttpGet.

    <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>
    

Especificar los datos que se devolverán de la página HTML analizada

Los datos que se devuelven de una página HTML analizada se expresan en la descripción de servicio mediante una serie de elementos XML que contienen expresiones regulares para analizar datos específicos, al tiempo que se proporciona un nombre para cada dato. El núcleo de cada elemento XML match que contiene las instrucciones de análisis es una expresión regular de .NET Framework. La expresión regular de .NET Framework proporciona una notación extensiva de coincidencia con un modelo que permite analizar rápidamente grandes cantidades de texto para buscar modelos de caracteres específicos. Para obtener más información acerca de la sintaxis de las expresiones regulares de .NET Framework, vea Expresiones regulares de .NET Framework.

Para especificar los datos devueltos de una página HTML analizada

  1. Agregue un elemento XML <text> completo con espacio de nombres dentro del elemento <output> correspondiente al elemento <operation> del elemento <binding> deseado.

  2. Agregue elementos XML <match> en la descripción de servicio dentro del elemento XML <text> para cada dato que desee que se devuelva en la página HTML analizada.

    Atributo Descripción
    name Nombre de la clase o propiedad que representa el dato devuelto. Si el elemento XML <match> tiene elementos <match> secundarios, una clase de proxy generada por la herramienta Wsdl.exe asocia el atributo name con una clase. Los elementos <match> secundarios se asignan a propiedades de la clase.
    pattern Modelo de expresión regular que se utilizará para obtener el dato. Para obtener más información acerca de la sintaxis de las expresiones regulares de .NET Framework, vea Expresiones regulares de .NET Framework.
    ignoreCase Especifica si la expresión regular se debe ejecutar sin distinguir entre mayúsculas y minúsculas. De forma predeterminada, se distinguen mayúsculas y minúsculas.
    repeats Especifica el número de valores que debe devolver la expresión regular, en caso de que ésta tenga varias coincidencias en la página HTML. Con el valor 1 se devuelve únicamente la primera coincidencia. Con el valor -1 se devuelven todas las coincidencias. Además, el valor -1 equivale al carácter '*' en una expresión regular. El valor predeterminado es -1.
    group Especifica un agrupamiento de coincidencias relacionadas.
    capture Especifica el índice de una coincidencia en un agrupamiento.
    type Las clases de proxy generadas mediante Wsdl.exe utilizarán el atributo de tipo como nombre de la clase devuelta para un elemento <match> que contenga elementos <match> secundarios. De forma predeterminada, una clase de proxy generada por Wsdl.exe establecerá el nombre especificado en el atributo name como nombre de la clase devuelta.

    En el ejemplo de código siguiente se muestra una sencilla página Web que contiene etiquetas <TITLE> y <H1>.

    <HTML>
     <HEAD>
      <TITLE>Sample Title</TITLE>
     </HEAD>
     <BODY>
        <H1>Some Heading Text</H1>
     </BODY>
    </HTML>
    

    En el ejemplo de código siguiente se muestra una descripción de servicio que analiza el contenido de la página HTML y extrae el contenido del texto delimitado por las etiquetas <TITLE> y <H1>. En el ejemplo se define un método TestHeaders para el enlace GetTitleHttpGet. El método TestHeaders define dos datos que la página HTML analizada puede devolver en elementos XML <match>: Title y H1, que analizan el contenido de las etiquetas <TITLE> y <H1>, respectivamente.

    <?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>
    

    El ejemplo de código siguiente es una parte de la clase de proxy generada por Wsdl.exe para la descripción de servicio anterior.

    ' 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;
    }
    

Vea también

Expresiones regulares de .NET Framework | MatchAttribute (Clase) | Generar servicios Web XML mediante ASP.NET