XML スキーマとデータ (Visual Studio Tools for Office)
更新 : 2007 年 11 月
対象 |
---|
このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。 プロジェクトの種類
Microsoft Office のバージョン
詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。 |
Microsoft Office Excel および Microsoft Office Word には、ドキュメントにスキーマを割り当てる機能があります。この機能により、ドキュメントへの XML データのインポートや、ドキュメントからの XML データのエクスポートを簡単に行うことができます。
メモ : |
---|
Excel ソリューションでは、マルチパート XML スキーマは使用できません。 |
Visual Studio Tools for Office では、ドキュメント レベルのカスタマイズにある割り当てられたスキーマ要素を、プログラミング モデル内でコントロールとして公開します。Excel では、Visual Studio Tools for Office によって、このコントロールのデータベース データへのバインディング、Web サービス、およびオブジェクトのサポートが追加されます。Word および Excel では、Visual Studio Tools for Office によって操作ウィンドウのサポートが追加されます。スキーマが割り当てられたドキュメントと併せて操作ウィンドウを使用すると、より優れたソリューションをエンド ユーザーに提供できます。詳細については、「操作ウィンドウの概要」を参照してください。
Excel のブックにスキーマを割り当てるときに作成されるオブジェクト
ブックにスキーマを割り当てると、Visual Studio によっていくつかのオブジェクトが自動的に作成され、プロジェクトに追加されます。こうしたオブジェクトは Excel で管理されるので、Visual Studio ツールを使って削除しないようにします。これらのオブジェクトを削除するには、割り当てられている要素をワークシートから削除するか、Excel ツールを使用してスキーマを削除します。
次に挙げる 2 つの主要なオブジェクトがあります。
XML スキーマ (XSD ファイル)。Visual Studio により、ブック内のスキーマごとにプロジェクトにもスキーマが追加されます。ソリューション エクスプローラでは、各スキーマが拡張子 XSD を持つプロジェクト項目として表されます。
型指定された DataSet クラス。このクラスは、スキーマに基づいて作成されます。このデータセット クラスは [クラス ビュー] で表示可能です。
スキーマ要素が Excel ワークシートに割り当てられるときに作成されたオブジェクト
[XML ソース] 作業ウィンドウのスキーマ要素をワークシートに割り当てると、Visual Studio では、自動的に複数のオブジェクトが作成され、プロジェクトに追加されます。
コントロール。ブック内で割り当てられているオブジェクトごとに、プログラミング モデル内に XmlMappedRange コントロール (非繰り返しスキーマ要素の場合) または ListObject コントロール (繰り返しスキーマ要素の場合) が作成されます。ListObject コントロールは、ブックから割り当て元および割り当て先のオブジェクトを削除することによってのみ削除できます。コントロールの詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
BindingSource。非繰り返しスキーマ要素をワークシートに割り当てて XmlMappedRange を作成すると、BindingSource が作成され、XmlMappedRange コントロールが BindingSource にバインドされます。BindingSource は、型指定された DataSet クラスから作成されたインスタンスなど、ドキュメントに割り当てたスキーマと一致するデータ ソースのインスタンスにバインドする必要があります。バインディングは、[プロパティ] ウィンドウで公開されている、DataSource プロパティと DataMember プロパティを設定して作成します。
メモ : BindingSource は、ListObject オブジェクトには作成されません。[プロパティ] ウィンドウの DataSource プロパティおよび DataMember プロパティを設定して、手動で ListObject をデータ ソースにバインドする必要があります。
Office のスキーマ割り当てと Visual Studio の [データ ソース] ウィンドウ
Office のスキーマ割り当て機能と Visual Studio の [データ ソース] ウィンドウは、Excel ワークシートでレポートしたり編集したりするデータを表現するのに役立ちます。どちらの場合も、Excel ワークシートにデータ要素をドラッグできます。どちらの方法でも、BindingSource から DataSet や Web サービスなどのデータ ソースにバインドするコントロールが作成されます。
メモ : |
---|
繰り返しスキーマ要素をワークシートに割り当てると、Visual Studio Tools for Office によって ListObject が作成されます。ListObject は、BindingSource を介して自動的にデータにバインドされることはありません。[プロパティ] ウィンドウの DataSource プロパティおよび DataMember プロパティを設定して、手動で ListObject をデータ ソースにバインドする必要があります。 |
この 2 つの方法の相違点の一部を以下の表に示します。
XML スキーマ |
[データ ソース] ウィンドウ |
---|---|
Office インターフェイスを使用する。 |
Visual Studio の [データ ソース] ウィンドウを使用する。 |
XML ファイルのデータのインポートとエクスポートを行う Office の組み込みの機能を有効にする。 |
インポートとエクスポートの機能はプログラムによって行う必要がある。 |
生成されたコントロールにデータを書き込むにはコードを記述する必要がある。 |
[データ ソース] ウィンドウから追加されたコントロールには、データを書き込むコード、およびデータベース サーバーを使用するときに必要な接続文字列が自動的に生成される。 |
Word 文書にスキーマを割り当てた場合の動作
ドキュメント レベルの Visual Studio Tools for Office プロジェクトで使用する Word 文書にスキーマを割り当てた場合は、データ オブジェクトは作成されません。ただし、文書にスキーマ要素を割り当てると、コントロールが作成されます。どのタイプの要素を割り当てるかによって、コントロールの種類は異なります。繰り返し要素の場合は XMLNodes コントロールが、非繰り返し要素の場合は XMLNode コントロールが作成されます。詳細については、「XMLNodes コントロール」および「XMLNode コントロール」を参照してください。
XML スキーマを含んだソリューションの配置
文書に割り当てられた XML スキーマを使用しているソリューションを配置するには、インストーラを作成する必要があります。そのインストーラで、ユーザーのコンピュータのスキーマ ライブラリにスキーマを登録します。スキーマを登録しなくても、ユーザーが文書を開いたときに、文書内の要素に基づいて Word で一時スキーマが生成されるため、ソリューションは動作します。ただし、この場合、ユーザーは、プロジェクトの作成に使用されたスキーマの妥当性検査や保存を行うことができません。インストーラの詳細については、「アプリケーションとコンポーネントの配置」を参照してください。
コードをプロジェクトに追加して、スキーマがライブラリにあって登録されているかどうかを検査することもできます。登録されていない場合には、ユーザーに警告できます。
' Ensure that the schema is in the library and registered with the document.
Private Function CheckSchema() As Boolean
Const namespaceUri As String = "http://schemas.contoso.com/projects"
Dim namespaceFound As Boolean = False
Dim namespaceRegistered As Boolean = False
Dim n As Word.XMLNamespace
For Each n In Application.XMLNamespaces
If (n.URI = namespaceUri) Then
namespaceFound = True
End If
Next
If Not namespaceFound Then
MessageBox.Show("XML Schema is not in library.")
Return False
End If
Dim r As Word.XMLSchemaReference
For Each r In Me.XMLSchemaReferences
If (r.NamespaceURI = namespaceUri) Then
namespaceRegistered = True
End If
Next
If Not namespaceRegistered Then
MessageBox.Show("XML Schema is not registered for this document.")
Return False
End If
Return True
End Function
// Ensure that the schema is in the library and registered with the document.
private bool CheckSchema()
{
const string namespaceUri = "http://schemas.contoso.com/projects";
bool namespaceFound = false;
bool namespaceRegistered = false;
foreach (Word.XMLNamespace n in Application.XMLNamespaces)
{
if (n.URI == namespaceUri)
{
namespaceFound = true;
}
}
if (!namespaceFound)
{
MessageBox.Show("XML Schema is not in library.");
return false;
}
foreach (Word.XMLSchemaReference r in this.XMLSchemaReferences)
{
if (r.NamespaceURI == namespaceUri)
{
namespaceRegistered = true;
}
}
if (!namespaceRegistered)
{
MessageBox.Show("XML Schema is not registered for this document.");
return false;
}
return true;
}