Web ページのコンテンツを解析する XML Web サービスの作成
現在では、Web によって非常に多くの情報が公開されています。ただし、このデータの大部分はユーザーがブラウザで参照するためにだけ作成されています。ASP.NET を使用して作成した XML Web サービスは、リモートの HTML ページのコンテンツを解析し、その結果のデータをプログラムによって公開できるようにする HTML 解析ソリューションを提供することによって、現在のソリューションの改善を支援します。Web サイトのコンテンツの発行者からアクセス許可を取得すると、そのコンテンツのレイアウトが変更されていないことを前提として、HTML を解析し、クライアントが利用できる XML Web サービスとして公開できます。
Web ページのコンテンツを解析する XML Web サービスの作成には、一般的な XML Web サービスの作成とは異なるパラダイムが使用されます。HTML ページを解析する XML Web サービスは、サービスの説明を作成することによって実装されます。サービスの説明は、Web サービス記述言語 (WSDL: Web Services Description Language) で記述された XML ドキュメントです。サービスの説明には、入力パラメータと、解析後の HTML ページから返すデータの両方を指定する複数の XML 要素を追加します。解析後の HTML ページから返すデータの指定では、HTML コンテンツを解析する命令が指定されるため、この部分は実装の大部分が行われる部分と言えます。これらの XML 要素を追加して、HTML ページを解析する XML Web サービスを作成するには、開発者は WSDL で記述された XML ドキュメントのレイアウトを理解する必要があります。WSDL の詳細については、W3C の Web サイト (www.w3.org/TR/wsdl) で WSDL の仕様を参照してください。
入力パラメータの指定
解析対象の HTML ページが、解析後に返されるその HTML ページのコンテンツに影響を与えるパラメータを受け入れる場合、入力パラメータを Web サーバーに渡すことができます。
入力パラメータを指定するには
<part> XML 子要素を、特定の <portType> で <input> 操作を表しているサービスの説明にある <message> XML 要素に追加します。
各 <part> 子要素がパラメータを表し、これらの子要素には name と type の 2 つの属性があります。name 属性はパラメータ名、type 属性はパラメータのデータ型です。サービスの説明の types セクションで、XSD スキーマ内に複合型を定義してから、その複合型をパラメータのデータ型として指定できます。
TitlesHttpGet
<portType> のGetTitlesHttpGetIn
<message> 内に 3 つの入力パラメータparam1
、param2
、およびparam3
を定義するコード例を次に示します。<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>
解析後の HTML ページから返すデータの指定
解析後の HTML ページから返すデータをサービスの説明内で表現するには、特定のデータを解析するための正規表現を含む一連の XML 要素を使用し、そのデータの各部分に名前を指定します。解析命令を含む各 match XML 要素の中核となるのは、.NET Framework の正規表現です。.NET Framework の正規表現による広範なパターン一致表記法を使用することで、大量のテキストをすばやく解析して特定の文字パターンを検索できます。.NET Framework の正規表現構文の詳細については、「.NET Framework の正規表現」を参照してください。
解析後の HTML ページから返すデータを指定するには
目的の <binding> の <operation> 要素の <output> 要素内に、名前空間で限定された <text> XML 要素を追加します。
サービスの説明の、解析後の HTML ページから返す各データの <text> XML 要素内に <match> XML 要素を追加します。
属性 説明 name 返されるデータを表すクラス名またはプロパティ名を指定します。<match> XML 要素に <match> 子要素がある場合、Wsdl.exe ツールによって生成されたプロキシ クラスによって、name 属性がクラスに関連付けられます。<match> 子要素はそのクラスのプロパティに割り当てられます。 pattern 特定のデータを取得するために使用する正規表現パターンを指定します。.NET Framework の正規表現構文の詳細については、「.NET Framework の正規表現」を参照してください。 ignoreCase 大文字と小文字を区別して正規表現を実行するかどうかを指定します。既定では、大文字と小文字が区別されます。 repeats 正規表現に一致するデータが HTML ページに複数あった場合に、正規表現から返されるデータを示す数値を指定します。値 1 を指定すると、最初に一致したデータだけを返します。値 -1 を指定すると、一致したすべてのデータを返します。値 -1 は正規表現の * と同じです。既定値は、-1 です。 group 関連する一致データのグループ化を指定します。 capture グループ内の一致データのインデックスを指定します。 type Wsdl.exe を使用して生成されるプロキシ クラスは、<match> 子要素を含む <match> に対して返されるクラスの名前として type 属性を使用します。既定では、Wsdl.exe によって生成されるプロキシ クラスは、返されたクラスの名前を、name 属性で指定された名前に設定します。 <TITLE>
タグと<H1>
タグを含む簡単な Web ページのサンプルを示すコード例を次に示します。<HTML> <HEAD> <TITLE>Sample Title</TITLE> </HEAD> <BODY> <H1>Some Heading Text</H1> </BODY> </HTML>
HTML ページのコンテンツを解析し、
<TITLE>
タグと<H1>
タグ内のテキストの内容を抽出するサービスの説明を次のコード例に示します。このコード例では、GetTitleHttpGet
バインディングに対してTestHeaders
メソッドが定義されています。このTestHeaders
メソッドは、解析後の HTML ページから返すことができる 2 つのデータを <match> XML 要素であるTitle
とH1
で定義しており、これによって<TITLE>
タグと<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>
前のサービスの説明に対して Wsdl.exe によって生成されるプロキシ クラス部分を示すコード例を次に示します。
' 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; }
参照
.NET Framework の正規表現 | MatchAttribute クラス | ASP.NET を使用した XML Web サービスの作成