任意の XPath プロパティ ハンドラ (BizTalk Server サンプル) では、BizTalk Server に送信される XML ドキュメント上で特定のプロパティを昇格させるためのカスタム パイプライン コンポーネントを記述する方法を示します。 サンプルに含まれる機能を使用して、XPath 式を評価する通常、アセンブラ、および逆アセンブラの各カスタム コンポーネントを作成できます。
このサンプルの処理
このサンプルには、処理する注文書 (PO) XML ドキュメント DocInstance.xml が含まれています。 このサンプルでは、次の手順で DocInstance.xml を処理します。
DocInstance.xml は BizTalk Server 受信ポートによって取得され、任意の XPath プロパティ ハンドラというカスタム パイプライン コンポーネントによって処理されます。
任意の XPath プロパティ ハンドラー コンポーネントは、PO スキーマで定義されている任意の XPath 式を使用して、すべての <Price> 要素と <Quantity> 要素を昇格させます。 XPath 式には、PO ドキュメントのルート要素のあいまいな子要素で使用される位置コンストラクタも含まれています。
任意の XPath プロパティ ハンドラ コンポーネントはメッセージの種類を判断し、メッセージ コンテキストに昇格させます。
次に、その後の処理のために、昇格する要素を持つ XML ドキュメントをオーケストレーションに送信します。
オーケストレーションは、PO ドキュメント内の昇格する要素にアクセスし、PO 内の項目の合計数を計算します。
オーケストレーションは、元の PO と更新された合計の両方からの情報を含む新しい PO ドキュメントを作成します。
新しい PO ドキュメントは、\Output ディレクトリのファイルに書き込まれます。
このサンプルの場所
<Samples Path>\Pipelines\ArbitraryXPathPropertyHandler
次の表は、このサンプルのファイルとその目的を示しています。
ファイル | 説明 |
---|---|
ArbitraryXPathPropertyHandler.sln | カスタムのパイプライン コンポーネント ソリューション ファイルです。 |
ArbitraryXPathPropertyHandler.resX | リソース ファイルです。 |
ArbitraryXPathPropertyHandlerComp.cs | 主要なコンポーネント実装です。 |
AssemblyInfo.cs | アセンブリ情報です。 |
Cleanup.bat | サンプルのクリーンアップ ファイル。 |
PromotingMap.cs | ネイティブの CLR 型マップ実装としてのプロパティの昇格です。 |
PropertyAttributes.cs | カスタム属性、プロパティ記述子、および ICustomTypePropertyDescriptor 実装です。 |
SchemaMap.cs | スキーマのあいまいさを解決するための、メッセージの種類から IDocumentSpec へのスキーマ マッピングです。 |
Setup.bat | サンプル パイプライン コンポーネントをビルドおよび設定します。 |
VirtualStream.cs | 仮想ストリームの実装です。 |
SeekableReadOnlyStream.cs | シーク可能な読み取り専用ストリームの実装です。 |
ArbitraryXPathSample.sln | サンプルのオーケストレーション ソリューション ファイルです。 |
CalculateTotalAmount.odx | サンプルのオーケストレーションです。 |
PODocument.xsd | 注文書スキーマ。 |
DocInstance.xml | サンプルの注文書インスタンスです。 |
このサンプルのビルドと初期化
このサンプルは、SQL Serverが同じコンピューター上で実行されているBizTalk Server環境で実行するように設計されています。 環境がこの構成と異なる場合は、正しい SQL Server コンピュータを指定するように、任意の XPath プロパティ ハンドラ (BizTalk Server サンプル) を変更する必要があります。
重要
Setup.bat は、Microsoft Windows のインストール ディレクトリが C:\Windows であることを前提にしています。 Windows のインストールが別のディレクトリの場合は、グローバル アセンブリ キャッシュの Microsoft.BizTalk.Component.Utilities アセンブリの場所を反映するように、ArbitraryXPathPropertyHandler.csproj ファイルを変更する必要があります。 Reference 要素で、SYSTEMROOT> を Windows がインストールされている場所 (C:\WINNT\ など) に変更<します。
<Reference
Name = "Microsoft.BizTalk.Component.Utilities"
AssemblyName = "Microsoft.BizTalk.Component.Utilities"
HintPath = "<SYSTEMROOT>\assembly\GAC\Microsoft.BizTalk.Component.Utilities\3.0.1.0__31bf3856ad364e35\Microsoft.BizTalk.Component.Utilities.dll"
/>
次の手順を使用して、任意の XPath プロパティ ハンドラ (BizTalk Server サンプル) の作成および初期化を行います。
このサンプルを作成および初期化するには
コマンド ウィンドウで、ディレクトリ (cd) を次のフォルダーに変更します。
<Samples Path>\Pipelines\ArbitraryXPathPropertyHandler
ファイル Setup.bat を実行すると、次のアクションが実行されます。
任意の XPath プロパティ ハンドラ パイプライン コンポーネントをビルドします。
ビルドされたパイプライン コンポーネントをインストール パス>\パイプライン コンポーネント ディレクトリに<コピーします。
送信ポートおよび受信ポートを作成します。
サンプルで使用される入力ディレクトリと出力ディレクトリを作成します。
サンプルの BizTalk Server オーケストレーション ArbitraryXPathSample をインストールします。
ポートをサンプル オーケストレーションにバインドします。
オーケストレーションを開始します。
Note
ビルドおよび初期化中にエラーが報告されることはありません。 エラーが発生した場合は、必要なソフトウェアがすべてインストールされ、パスで Microsoft ビルド ツールが使用できることを確認してください。
Note
Setup.bat によって行われた変更を元に戻すには、まず、BizTalk Server管理コンソールからホスト インスタンスを停止して再起動する必要があります。 次に、Cleanup.bat を実行します。 Setup.bat を 2 回目に実行する場合は、その前に Cleanup.bat を実行してください。
このサンプルの実行
次の手順を使用して、任意の XPath プロパティ ハンドラ (BizTalk Server サンプル) を実行します。
このサンプルを実行するには
注文書 (PO) ファイル DocInstance.xml を \Input ディレクトリにコピーします。 PO ファイルは受信ポートによって取得されます。受信ポートは、XML データを任意の XPath プロパティ ハンドラ パイプライン コンポーネントに送信します。
\Output ディレクトリの内容を表示します。 \Input ディレクトリにコピーした DocInstance.xml ファイルのすべての情報を含む新しいファイルが作成されています。 ファイルの違いは、 <TotalAmount> 要素に PO の合計金額が設定されていることです。
説明
正規の XPath 式は、"/*[local-name()='element-name' や namespaceURI()='']/*[local-name()='http://MyUri.orgelement-name']/@*[local-name='attribute-name']" などの単純な式です。
任意の XPath 式は、"//element-name//*[local-name()='element-name' and position()=2]" のように複雑な場合があります。 実際は、XPath ボディまたは XPath プロパティで使用される非正規 XPath がスキーマに含まれる場合に、BizTalk Server では非正規 XPath 式はサポートされていないというランタイム エラーが発生します。 任意の XPath 式をサポートできるようにするには、任意の XPath ボディと任意の XPath プロパティ式の両方をサポートするカスタムの逆アセンブラおよびアセンブラ コンポーネントを作成します。
このサンプルでは、 IComponent.Execute が実装されている場合に、カスタム パイプライン コンポーネントで次の一連の手順を使用します。
入力メッセージのボディ部ストリームで仮想のシーク可能ストリームを作成します (入力メッセージが大きく、ストリームをシークできない可能性があるため、メモリ使用量を少なくし、ストリーム位置を変更できるようにします)。
新しい送信メッセージ、およびメッセージの新しいボディ部を作成し、仮想ストリームを新しいボディ部に割り当て、ボディ部のプロパティのクローンを作成し、メッセージ コンテキストのクローンを作成します。
入力メッセージ、またはデザイン時に指定されたスキーマに基づいて、スキーマを取得します。
ストリームをSystem.Xml のインスタンスに読み込みます 。XmlDocument。
昇格させたプロパティと識別フィールドを処理し、送信メッセージのメッセージ コンテキストへの昇格または書き込みを行います。
送信メッセージを返します。
送信メッセージをファイルに書き込みます。