path 引数により指定されたパスを表す、修正可能な SqlPathExpression オブジェクトを作成します。 修正可能とは、ナビゲートの際、パスのエレメントがまだ存在していないとしても、これが作成されるということを意味します。 この関数は、PathExpression オブジェクトへのポインターを戻します。これは、パスをナビゲートする関数、すなわち cniSqlNavigatePath ファミリーへの入力として使用されます。式の作成にはオーバーヘッドが伴うため、すべてのメッセージに同じパス式が使用される場合には、この関数を 1 回呼び出し、戻された CciSqlPathExpression* を使用して、cniSqlNavigate をそれぞれのメッセージごとに呼び出すようにします。 CciSqlPathExpression は、作成元のスレッドとは異なるスレッドでも使用可能です。
CciSqlPathExpression* cniSqlCreateModifiablePathExpression( int* returnCode, CciNode* nodeObject, CciChar* dataSourceName, CciChar* path);
成功した場合、SQLPathExpression オブジェクトのアドレスが戻されます。 エラーが発生した場合、CCI_NULL_ADDR が戻され、戻りコード・パラメーターがエラーの理由を示します。 SQLPathExpression が不要になったら (通常はノードが削除されるとき)、cniSqlDeletePathExpression を呼び出してそれを削除する必要があります。
以下のコードを Transform ノード・サンプルに追加することにより、1 回の関数呼び出しで、エレメントと必要な上位エレメントすべてを容易に作成することができます。
以下のようにして、CciSQLPathExpression を _Transform_createNodeContext 関数で作成します。
{ CciChar ucsPathExpressionString[32]; char* mbPathExpressionString = "OutputRoot.XML.Request.A.B.C.D.E"; /* convert our path string to unicode*/ cciMbsToUcs(NULL, mbPathExpressionString, ucsPathExpressionString, 32, BIP_DEF_COMP_CCSID); p->pathExpression = cniSqlCreateModifiablePathExpression( NULL, nodeObject, NULL,/*we do not reference Database*/ ucsPathExpressionString); }
その後、この CciSqlPathExpression を、以下のように後で _Transform_evaluate 関数内で使用することができます。
{ CciElement* newElement = cniSqlNavigatePath( NULL, ((NODE_CONTEXT_ST *)context)->pathExpression, message, destinationList, exceptionList, outMsg, NULL,/*we do not reference OutputLocalEnvironment*/ NULL/*we do not reference OutputLExceptionList*/); }
ここで、以下の入力メッセージ PluginSample.change.xml を渡します。
<Request type="change"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> </Request>
そうすると、次の出力メッセージが得られます。
<Request type="modify"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> <A> <B> <C> <D/> </C> </B> </A> </Request>