Visual Basic を使用した SAX2 アプリケーション作成のジャンプスタート

Visual Basic を使用した SAX2 アプリケーション作成のジャンプスタート

Microsoft Corporation

November 2000

download sample code この記事のサンプル コードをダウンロードする。 (51 KB)

サンプル コードをオンラインで参照する。

概要 : この記事は、Microsoft Visual Basic を使用した、Simple API for XML (SAX2) アプリケーションを構築の手引きとなります。この文書では、SAX2 を使用して XML 文書を読み、テキスト ボックスに文書の内容を出力するアプリケーションを素早く作成する方法について説明します。

注 : このチュートリアルを実行するには、最新の製品版の Microsoft XML Parser (MSXML) が必要です。これは、XML Developer Center から入手可能です。

Contents

ジャンプスタート アプリケーション (Visual Basic) の概要
ContentHandler の実装
ErrorHandler の実装
メイン フォーム の作成

ジャンプスタート アプリケーション (Visual Basic) の概要

SAX2 は「プッシュ モデル」のパーサーです。SAX2 が文書を検証する際には、SAXXMLReader (SAX2 reader) が文書を読み、一連のイベントを実装済みのイベントハンドラに渡します。SAX2 リーダーはいくつかのカテゴリのイベントを生成します。 次のようなイベントを含みます。

  • XML 文書のコンテンツ中で発生するイベント。
  • 文書型定義 (DTD) 中で発生するイベント。
  • エラーとして発生するイベント。

このようなイベントを処理するには、適切なイベントを処理するメソッドを含んだ対応するハンドラ クラスを実装する必要があります。自分が処理したいイベント用のハンドラを実装するだけでよいです。もし特定の種類のイベントを処理するハンドラを実装しないのであれば、リーダーは単にそのイベントを無視します。

この章でカバーするジャンプスタート アプリケーションは、Microsoft® Visual Basic®で SAX2 アプリケーション用に非常によく実装される 3 つのコンポーネントを含みます。

コンポーネント 説明
ContentHandler IVBSAXContentHandler インターフェースを実装します。ContentHandler は、XML 文書の主要なコンテンツを処理するメソッドを提供するクラスです。SAX2 が文書を検証する際に、リーダーは、ContentHandler に一連のイベントを渡します。例えば、文書中のそれぞれの要素については、リーダーは startElementおよび、CharactersendElement を渡します。これらのイベントを処理するには、リーダーから受け取った情報を処理する ContentHandler 内のメソッドにコードを追加します。
ErrorHandler IVBSAXErrorHandler を実装する。ErrorHandler はリーダーによって渡されたエラー イベントを処理するメソッドを提供するクラスです。このとき、リーダーは fatalError メソッドを呼び出します。
メイン フォーム アプリケーションにユーザー インターフェイスを提供します。これは 2 つのテキスト ボックスから構成されています。一つはファイル名を入力するためのもので、もう一つは結果を表示するためのものです。このインターフェイスは、[Parse][Exit] ボタンを持ちます。ユーザー インターフェイスに加えて、メイン フォームは次のようなコードを含みます。
  1. リーダーおよび ContentHandler、ErrorHandler のインスタンスの生成。
  2. リーダーに対するハンドラ クラスの設定。
  3. 検証する文書のソースの設定。
  4. 検証作業の開始。

ContentHandler の実装

ジャンプスタート アプリケーション用に IVBSAXContentHandler インターフェイスを実装するクラスを追加することで ContentHandler を生成します。クラスを生成することは複雑な印象を受けるかもしれませんが、Visual Basic がほとんどの処理を自動化してくれます。

新しいプロジェクトを開く

IVBSAXContentHandler インターフェイス に基づいたクラスを生成するする前に、新しいプロジェクトを生成し、そのプロジェクトから MSXML を参照させなければなりません。

新しいプロジェクトの生成

Visual Basic 6.0 を開き、[新しいプロジェクト] ダイアログボックスの [標準 EXE] をダブル クリックします。

MSXML の参照

自分のアプリケーションに MSXML 3.0 が提供する MSXML2 タイプ ライブラリを使用するよう指示を出します。

MSXML 3.0 への参照を設定する。

[プロジェクト] メニューの [参照設定] をクリックします。[参照可能なライブラリ ファイル] リストから Microsoft XML, v3.0 を選択し、[OK] をクリックします。

ハンドラ クラスを生成し、実装する。

これで、新規に ContentHandler クラスを生成、実装する準備ができました。

新規クラスの生成

  1. [プロジェクト] メニューの [クラス モジュールの追加] をクリックします。
  2. [クラス モジュールの追加] ダイアログ ボックスの [クラス モジュール] をダブル クリックします。
  3. [表示] メニューの [プロパティ ウィンドウ] を選択します。
  4. [プロパティ] ウィンドウの (オブジェクト名) プロパティに ContentHandlerImpl と入力します。

ContentHandlerImpl クラスの実装

  1. [コード エディタ] ウィンドウに Implements と入力し、スペース バーを押します。

  2. 利用可能なクラスのドロップダウン リストが現れます。(このリストには、実際に抽象化クラスであるインターフェイスを含みます。) ドロップダウン リストから IVBSAXContentHandler をダブルクリックします。これは、ContentHandlerImpl クラスを生成するために実装するクラスです。

  3. コード エディタ ウィンドウの左側にある [オブジェクト] ボックスから IVBSAXContentHandler をクリックします。これで自動的にコード エディタ ウィンドウへコードが追加されます。

  4. コード エディタ ウィンドウの右側にある [プロシージャ] ボックスから、このクラスに追加したい IVBSAXContentHandler メソッドスあるいはプロパティを選択します。

    例えば、startElement を選択すると、このメソッドを ContentHandlerImpl クラスに追加できます。(XML 文書を検証する際に、リーダーは、文書中の新規の要素に遭遇するたびにこのメソッドを呼び出します。) リストから startElement を選択した後、コード エディタ ウィンドウに次のようなコードが現れます。

    Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _ 
    String, strLocalName As String, strQName As String, ByVal oAttributes _ 
    As MSXML2.IVBSAXAttributes)
    End Sub
    
  5. 対応するイベントを処理するメソッドあるいはイベントを 4 で選択可能にするには、適切なコードをそのメソッドあるいはプロパティに追加しなければなりません。

    startElement メソッドを 4 で追加するには、次のように、必要なコードを入力します。

    Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _ 
    String, strLocalName As String, strQName As String, ByVal attributes _ 
    As MSXML2.IVBSAXAttributes)
    
        Dim i As Integer
    
        Form1.TextBox1.text = Form1.TextBox1.text & "<" & strLocalName
    
        For i = 0 To (attributes.length - 1)
            Form1.TextBox1.text = Form1.TextBox1.text & " " & _
              attributes.getLocalName(i) & "=""" & attributes.getValue(i) _
              & """"
        Next
    
        Form1.TextBox1.text = Form1.TextBox1.text & ">"
    
        If strLocalName = "qu" Then
            Err.Raise vbObjectError + 1, "ContentHandler.startElement", _
              "Found element <qu>"
        End If
    
    End Sub
    
  6. リーダーから渡される追加イベントを処理するには、ContentHandlerImpl クラスに追加したいそれぞれのメソッドあるいはプロパティについて 4 と 5 の操作を繰り返します。

ContentHandlerImpl クラスの全コード

これまでの解説では、Microsoft XML v3.0 を参照する新しいプロジェクトを作成方法と、IVBSAXContentHandler インターフェイスを実装することで ContentHandlerImpl を呼び出す ContentHandler クラスの作成方法を説明しました。次に ContentHandlerImpl クラスの全コードを示します。

Option Explicit

Implements IVBSAXContentHandler

Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As _
  String,_strLocalName As String, strQName As String, ByVal attributes As _
  MSXML2.IVBSAXAttributes)
    
    Dim i As Integer
    
    Form1.TextBox1.text = Form1.TextBox1.text & "<" & strLocalName
   
    For i = 0 To (attributes.length - 1)
        Form1.TextBox1.text = Form1.TextBox1.text & " " & _
          attributes.getLocalName(i) & "=""" & attributes.getValue(i) _
          & """"
    Next

    Form1.TextBox1.text = Form1.TextBox1.text & ">"

    If strLocalName = "qu" Then
        Err.Raise vbObjectError + 1, "ContentHandler.startElement", _
          "Found element <qu>"
    End If

End Sub

Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, _
  strLocalName As String, strQName As String)
    
    Form1.TextBox1.text = Form1.TextBox1.text & "</" & strLocalName & ">"

End Sub

Private Sub IVBSAXContentHandler_characters(text As String)
    text = Replace(text, vbLf, vbCrLf)
    Form1.TextBox1.text = Form1.TextBox1.text & text
    
End Sub

Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As _
  MSXML2.IVBSAXLocator)

End Property

Private Sub IVBSAXContentHandler_endDocument()

End Sub

Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String)

End Sub

Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String)

End Sub

Private Sub IVBSAXContentHandler_processingInstruction(target As String, _
  data As String)
    
    Form1.TextBox1.text = Form1.TextBox1.text & "<?" & target & " " _
      & data & ">"

End Sub

Private Sub IVBSAXContentHandler_skippedEntity(strName As String)

End Sub

Private Sub IVBSAXContentHandler_startDocument()

End Sub

Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, _
  strURI As String)

End Sub

サンプル コードから分かることですが、全てのメソッドやプロパティが追加されたカスタム コードを持っているわけではありません。SAX2 用のヘッダを実装する際に、必要なメソッドやプロパティのみを追加することを選択できます。

ErrorHandler の実装

土台として上記のマテリアルを使うことで、ジャンプスタート アプリケーション用の ErrorHandler を生成できるようになりました。ErrorHandler は、IVBSAXErrorHandler インターフェイスを実装することで生成できます。例えば、次のようなプロシージャ中に記述します。

ErrorHandlerImpl クラスの生成

  1. [プロジェクト] メニューの [クラス モジュールの追加] をクリックする。
  2. [クラス モジュールの追加] ダイアログ ボックスの [クラス モジュール] をダブル クリックする。
  3. [表示] メニューの **[プロパティ ウィンドウ]**を選択する。
  4. [プロパティ] ウィンドウに、(オブジェクト名) プロパティとして、ErrorHandlerImpl と入力する。

ErrorHandlerImpl クラスの実装

  1. コード エディタ ウィンドウに Implements とタイプし、スペースバー を押して、現れたドロップダウン リストから IVBSAXErrorHandler をダブルクリックする。

  2. コード エディタ ウィンドウの左側にある [オブジェクト] ボックスから IVBSAXErrorHandler を選択する。

  3. コード エディタ ウィンドウの右側にある [プロシージャ] ボックスの中から、クラスに追加するメソッドやクラスを選択する。

  4. 選択したメソッドやプロパティに必要なコードを追加する。

  5. 必要なメソッドとプロパティが追加されるまで 3 と 4 の操作を繰り返す。

    注: ErrorHandlerImpl クラスのメソッドあるいはプロシージャの実装に問題が発生したら、ContentHandler の実装に戻って ContentHandlerImpl クラスのメソッドとプロパティの実装方法を参照してください。

ErrorHandlerImpl Class の全コード

ジャンプスタート アプリケーションの ErrorHandlerImpl クラスの全コードを示します。

Option Explicit

Implements IVBSAXErrorHandler

Private Sub IVBSAXErrorHandler_fatalError(ByVal lctr As IVBSAXLocator, _
  msg As String, ByVal errCode As Long)

    Form1.TextBox1.text = Form1.TextBox1.text & "*** error *** " & msg
    
End Sub

Private Sub IVBSAXErrorHandler_error(ByVal lctr As IVBSAXLocator, _
  msg As String, ByVal errCode As Long)
    
End Sub

Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As _
  MSXML2.IVBSAXLocator, strErrorMessage As String, ByVal nErrorCode _
  As Long)

End Sub

Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As _
  MSXML2.IVBSAXLocator, strErrorMessage As String, _
  ByVal nErrorCode As Long)

End Sub

前のコードでは、fatalError メソッドのみがエラー処理のコードを含みます。このバージョンの MSXML では、fatalError メソッドだけが IVBSAXErrorHandler から呼び出されます。

メイン フォーム の作成

メイン フォームはジャンプスタート アプリケーションのユーザー インターフェイスを提供します。ユーザー インターフェイスは、4 つの構成要素からなります。

インターフェイス要素 説明
Text1 検証するファイル名を入力するテキスト ボックス。
Command1 検証処理を開始するボタン。
Command2 アプリケーションを終了するボタン。
TextBox1 検証処理の結果を表示するテキスト ボックス。

インターフェイス要素の提供と並んで、メイン フォームは様々なクラスの必要なインスタンスを生成したり、検証処理を開始するコードを提供します。

目的 メイン フォームが使用するコード
リーダー (SAXXMLReader) のインスタンスを生成する。 Dim reader As SAXXMLReader
Set reader = New SAXXMLReader
ContentHandlerImpl のインスタンスを生成し、リーダーからイベントを受け取るように設定する。 Dim contentHandler As ContentHandlerImpl
Set reader.contentHandler = contentHandler
ErrorHandlerImpl のインスタンスを生成し、リーダーからイベントを受け取るように設定する。 Dim errorHandler As New ErrorHandlerImpl
Set reader.contentHandler = contentHandler
検証処理を開始する。 reader.parseURL (Text1.text)

メイン フォーム の全コード

ジャンプスタート アプリケーションのメイン フォームの全コード

Option Explicit

Private Sub Command1_Click()

    Dim reader As New SAXXMLReader    'Reads the XML document
    Dim contentHandler As New ContentHandlerImpl 'Receives parsing events
    Dim errorHandler As New ErrorHandlerImpl        'Receive error events
    TextBox1.text = ""
    Set reader.contentHandler = contentHandler    'They work together
    Set reader.errorHandler = errorHandler        'They also work together
    On Error GoTo 10
    reader.parseURL (Text1.text)               'Parse the document

    Exit Sub                                   'That's all, folks!

10: TextBox1.text = TextBox1.text & "*** Error *** " & Err.Number _
      & " : " & Err.Description
End Sub

Private Sub Command2_Click()
    End
End Sub

Exit Sub と line marked 10: とマークされた行は、ErrorHandler の外側から処理したい場合のみに必要です。それ以外の場合には、On Error Resume Next を使用します。

ジャンプスタート アプリケーションの実行

  1. Visual Basic ツールバーの [開始] ボタンをクリックします。
  2. File name ボックス中で、pathname\Test.xml と入力します。pathname は、Visual Basic ジャンプスタートファイルをインストールしたフォルダのパス名です。
  3. Parse をクリックします。ジャンプスタート アプリケーションはファイルを検証し、TextBox1 テキストボックス に結果を表示します。