ドキュメント レベルのカスタマイズにおける XML スキーマとデータ
重要 このトピックに記載されている Microsoft Word に関する情報は、マイクロソフトがカスタム XML に関連する特定の機能の実装を Microsoft Word から削除した 2010 年 1 月より前にマイクロソフトがライセンスを供与した Microsoft Word 製品上で実行されるプログラムを使用または開発する、米国およびその領土外に在住する個人および組織での利用のみを目的として提供されるものです。 ここに記載されている Microsoft Word に関する情報を、2010 年 1 月以降にマイクロソフトがライセンスを供与した Microsoft Word 製品上で実行されるプログラムを使用または開発する、米国およびその領土内の個人または組織が参照および使用することはお勧めしません。これに該当する製品は、この日付以前にライセンスが供与された製品、および米国外での使用を目的として購入またはライセンスが供与された製品と同様には動作しません。
対象: このトピックの情報は、Excel 2007 と Excel 2010、および Word 2007 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
Microsoft Office Excel および Microsoft Office Word には、ドキュメントにスキーマを割り当てる機能があります。 この機能により、ドキュメントへの XML データのインポートや、ドキュメントからの XML データのエクスポートを簡単に行うことができます。
Visual Studio では、ドキュメント レベルのカスタマイズにある割り当てられたスキーマ要素を、プログラミング モデル内でコントロールとして公開します。 さらに、Excel では、データベースのデータ、Web サービス、およびオブジェクトに、このコントロールをバインドできます。 また、Word および Excel では、操作ウィンドウもサポートされており、スキーマが割り当てられたドキュメントと併せて使用することにより、エンド ユーザーによるソリューションの操作性を向上させることができます。 詳細については、「操作ウィンドウの概要」を参照してください。
注意
Excel ソリューションでは、マルチパート XML スキーマは使用できません。
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 によって ListObject が作成されます。 ListObject は、BindingSource を介して自動的にデータにバインドされることはありません。 [プロパティ] ウィンドウの DataSource プロパティおよび DataMember プロパティを設定して、手動で ListObject をデータ ソースにバインドする必要があります。
この 2 つの方法の相違点の一部を以下の表に示します。
XML スキーマ |
[データ ソース] ウィンドウ |
---|---|
Office インターフェイスを使用する。 |
Visual Studio の [データ ソース] ウィンドウを使用する。 |
XML ファイルのデータのインポートとエクスポートを行う Office の組み込みの機能を有効にする。 |
インポートとエクスポートの機能はプログラムによって行う必要がある。 |
生成されたコントロールにデータを書き込むにはコードを記述する必要がある。 |
[データ ソース] ウィンドウから追加されたコントロールには、データを書き込むコード、およびデータベース サーバーを使用するときに必要な接続文字列が自動的に生成される。 |
Word 文書にスキーマを割り当てた場合の動作
ドキュメント レベルの 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;
}