Creazione di servizi Web XML che analizzano il contenuto di una pagina Web
Sul Web è oggi disponibile un'ampia gamma di informazioni. Purtroppo, gran parte di tali informazioni può essere interpretata facilmente solo se letta tramite un browser. I servizi Web XML creati con ASP.NET consentono di migliorare tale situazione grazie a una soluzione di analisi HTML che consente agli sviluppatori di analizzare il contenuto di una pagina HTML remota e di esporre i dati risultanti a livello di codice. Dopo aver ottenuto le necessarie autorizzazioni da parte dell'editore del sito Web, se il layout del contenuto non viene modificato, è possibile utilizzare l'analisi HTML per esporre i servizi Web XML che possono essere utilizzati dai client.
Per la generazione di un servizio Web XML che analizzi il contenuto di una pagina Web è necessario utilizzare un paradigma diverso da quello richiesto per la creazione di un servizio Web XML tipico. Il servizio Web XML che analizza la pagina HTML viene implementato creando una descrizione del servizio, ovvero un documento XML nel linguaggio WSDL (Web Services Description Language). Alla descrizione del servizio vengono aggiunti gli elementi XML che consentono di specificare sia i parametri di input sia i dati da restituire dalla pagina HTML analizzata. Gran parte dell'implementazione viene eseguita specificando i dati restituiti dalla pagina HTML analizzata, in quanto è in questa fase che vengono definite le istruzioni per l'analisi del contenuto HTML. Per aggiungere gli elementi XML e creare quindi un servizio Web XML che analizzi una pagina HTML, lo sviluppatore deve conoscere il layout di un documento XML scritto nel linguaggio WSDL. Per informazioni dettagliate su WSDL, vedere la specifica WSDL nel sito Web W3C all'indirizzo www.w3.org/TR/wsdl/ (informazioni in lingua inglese).
Definizione dei parametri di input
I parametri di input possono essere passati al server Web se la pagina HTML analizzata accetta i parametri che modificano il contenuto della pagina HTML restituita.
Per definire i parametri di input
Aggiungere gli elementi XML figlio <part> all'elemento XML <message> nella descrizione del servizio che rappresenta l'operazione <input> per un determinato <portType>.
Ogni elemento figlio <part> rappresenta un parametro e dispone di due attributi: name e type. L'attributo name indica il nome del parametro, mentre l'attributo type indica il tipo di dati del parametro. È possibile definire tipi complessi all'interno di uno schema XSD nella sezione types della descrizione del servizio e specificarli come tipi di dati per il parametro.
Nell'esempio di codice seguente vengono definiti tre parametri di input denominati
param1
,param2
eparam3
nell'elemento <message>GetTitlesHttpGetIn
per <portType>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>
Definizione dei dati restituiti dalla pagina HTML analizzata
I dati che devono essere restituiti da una pagina HTML analizzata vengono espressi nella descrizione del servizio utilizzando una serie di elementi XML che contengono le espressioni regolari per l'analisi di blocchi di dati specifici e assegnando un nome a ognuno di tali blocchi. Un'espressione regolare di .NET Framework è alla base di ogni elemento XML match contenente le istruzioni per l'analisi. Con le espressioni regolari di .NET Framework viene fornita una notazione estesa per la definizione di criteri in base ai quali analizzare rapidamente grandi quantità di testo alla ricerca di determinate combinazioni di caratteri. Per ulteriori informazioni sulla sintassi delle espressioni regolari di .NET Framework, vedere Espressioni regolari di .NET Framework.
Per specificare i dati restituiti da una pagina HTML analizzata
Aggiungere un elemento XML <text> qualificato come spazio dei nomi nell'elemento <output> dell'elemento <operation> per il <binding> desiderato.
Aggiungere gli elementi XML <match> alla descrizione del servizio nell'elemento XML <text> per ogni blocco di dati che deve essere restituito dalla pagina HTML analizzata.
Attributo Descrizione name Nome della classe o della proprietà che rappresenta il blocco di dati restituito. Una classe proxy generata dallo strumento Wsdl.exe associa l'attributo name a una classe, se l'elemento XML <match> presenta elementi <match> figli, i quali vengono mappati alle proprietà della classe. pattern Criterio formato da un'espressione regolare da utilizzare per ottenere un blocco di dati. Per ulteriori informazioni sulla sintassi delle espressioni regolari di .NET Framework, vedere Espressioni regolari di .NET Framework. ignoreCase Specifica se l'espressione regolare deve essere eseguita senza distinzione tra maiuscole e minuscole. Per impostazione predefinita, viene fatta distinzione tra maiuscole e minuscole. repeats Specifica il numero di valori che devono essere restituiti dall'espressione regolare se quest'ultima ricorre più volte nella pagina HTML. Se il valore è impostato su 1, verrà restituita solo la prima corrispondenza. Se il valore è impostato su -1, vengono restituite tutte le corrispondenze. Il valore -1 corrisponde all'uso di un asterisco (*) in una espressione regolare. L'impostazione predefinita del valore è -1. group Specifica il raggruppamento di corrispondenze correlate. capture Specifica l'indice di una corrispondenza nel raggruppamento. type Le classi proxy generate mediante Wsdl.exe utilizzeranno l'attributo di tipo come nome della classe restituita per un elemento <match> che contiene elementi <match> figli. Per impostazione predefinita, in una classe proxy generata da Wsdl.exe il nome della classe restituita sarà impostato sul nome specificato nell'attributo name. Nell'esempio di codice seguente viene riportata una semplice pagina Web di esempio contenente i tag
<TITLE>
e<H1>
.<HTML> <HEAD> <TITLE>Sample Title</TITLE> </HEAD> <BODY> <H1>Some Heading Text</H1> </BODY> </HTML>
Nell'esempio di codice che segue viene riportata una descrizione del servizio che analizza il contenuto della pagina HTML estraendo il contenuto dal testo inserito tra i tag
<TITLE>
e<H1>
. Nell'esempio di codice viene definito un metodoTestHeaders
per l'associazioneGetTitleHttpGet
. Il metodoTestHeaders
definisce due blocchi di dati che possono essere restituiti dalla pagina HTML analizzata negli elementi XML <match>:Title
eH1
, che analizzano, rispettivamente, il contenuto dei tag<TITLE>
e<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>
Nell'esempio di codice seguente viene riportata una parte della classe proxy generata da Wsdl.exe per la descrizione del servizio precedente.
' 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; }
Vedere anche
Espressioni regolari di .NET Framework | Classe MatchAttribute | Generazione di servizi Web XML mediante ASP.NET