지정된 요소의 비트스트림 표현을 가져옵니다. 요소와 연관된 구문 분석기는 요소 및 모든 하위 요소를 직렬화합니다. 결과는 호출자가 할당한 메모리에 복사됩니다. 지정된 모든 옵션이 원본 비트스트림 옵션과 일치하며(예: MQInput 노드가 WebSphere MQ 큐에서 읽은 비트스트림의 경우) 원본 비트스트림을 수신한 이후 메시지가 수정되지 않은 특수한 경우, 이 원본 비트스트림은 사용자가 할당한 메모리로 복사됩니다. 이 경우, 메시지를 구문 분석하고 다시 직렬화하기 위해 구문 분석기가 필요하지 않습니다.
그러므로 이러한 등록 정보를 판별하는 알고리즘은 기본적으로 ESQL BITSTREAM 함수에 사용되는 알고리즘과 같습니다.
일부 구문 분석기는 다른 모드인 FolderBitStream도 지원하며 이 모드에서는 가리키는 필드가 폴더를 나타낸다는 전제 하에 하위 트리에 대해 의미있는 비트스트림이 생성됩니다.
CciSize cniElementAsBitstream( int* returnCode, CciElement* element, const struct CciByteArray* value, CciChar* messageType, CciChar* messageSet, CciChar* messageFormat, int encoding, int ccsid, int options);
다음 예에서는 옵션 매개변수를 사용하여 메시지 트리의 다른 부분에 대한 비트스트림을 생성하는 방법을 보여줍니다.
MQMD RFH2 <test><data><stuff>things</stuff></data></test>노드는 세 개의 메시지를 전달하는 데 그 중 하나는 BLOB 도메인에 입력 메시지의 사본이 포함되어 있습니다. 다른 메시지는 BLOB 도메인에 입력 RFH2의 사본을 메시지 본문으로 포함하고 있습니다. 또다른 메시지는 BLOB 도메인에 <data></data> 폴더를 메시지 본문으로 포함하고 있습니다.
CciMessage* outMsg[3]; CciTerminal* terminalObject; CciElement* bodyChild; CciElement* inRootElement; CciElement* inSourceElement[3]; CciElement* outRootElement; CciElement* outBlobElement; CciElement* outBody; struct CciByteArray bitstream[3]; int bitstreamOptions[3]; int retvalue; int rc = 0; int loopCount; CCI_EXCEPTION_ST exception_st = {CCI_EXCEPTION_ST_DEFAULT}; const CciChar* constBLOBParserName = cciString("NONE",BIP_DEF_COMP_CCSID); const CciChar* constBLOBElementName = cciString("BLOB",BIP_DEF_COMP_CCSID); const CciChar* constEmptyString = cciString("",BIP_DEF_COMP_CCSID); /*build up and propagate 3 output messages*/ /*first message has bit stream for input message body*/ /*second message has bit stream for input RFH2*/ /*third message has bit stream for sub element from input message*/ /* Get the root element of the input message */ inRootElement=cniRootElement(&rc, message); /*CCI_CHECK_RC();*/ checkRC(rc); /*set up the array of source elements and bitstream options*/ /*message body*/ inSourceElement[0] = cniLastChild(&rc,inRootElement); checkRC(rc); /*This is the root of the message body so we use RootBitStream mode*/ bitstreamOptions[0] = CCI_BITSTREAM_OPTIONS_ROOT; /*last header*/ inSourceElement[1] = cniPreviousSibling(&rc,inSourceElement[0]); checkRC(rc); /*This is the root of the RFH2 so we use RootBitStream mode*/ bitstreamOptions[1] = CCI_BITSTREAM_OPTIONS_ROOT; /*body.FIRST(first child of message body) */ inSourceElement[2] = cniFirstChild(&rc,inSourceElement[0]); checkRC(rc); /*body.FIRST.FIRST */ inSourceElement[2] = cniFirstChild(&rc,inSourceElement[2]); checkRC(rc); /*This is a sub tree within the message body so we use FolderBitStream mode*/ bitstreamOptions[2] = CCI_BITSTREAM_OPTIONS_FOLDER; for (loopCount=0;loopCount<3;loopCount++) { int bufLength; /* Create new message for output */ outMsg[loopCount] = cniCreateMessage(&rc, cniGetMessageContext(&rc, message)); checkRC(rc); /* Get the root element of the output message */ outRootElement = cniRootElement(&rc, outMsg[loopCount]); checkRC(rc); /* Copy the contents of the input message to the output message */ cniCopyElementTree(&rc, inRootElement, outRootElement); checkRC(rc); /* Get the last child of root (ie the body) */ bodyChild = cniLastChild(&rc, outRootElement); checkRC(rc); /*throw away the message body which was copied from the input message*/ cniDetach(&rc, bodyChild); checkRC(rc); /*create the new output message body in the BLOB domain*/ outBody = cniCreateElementAsLastChildUsingParser(&rc, outRootElement, constBLOBParserName); checkRC(rc); /*create the BLOB element*/ outBlobElement = cniCreateElementAsLastChild(&rc, outBody); checkRC(rc); cniSetElementName(&rc, outBlobElement, constBLOBElementName); checkRC(rc); /*Set the value of the blob element by obtaining the bit stream for the */ bitstream[loopCount].size=512; bitstream[loopCount].pointer=(CciByte*)malloc(sizeof(CciByte) * 512); bufLength = cniElementAsBitstream(&rc, inSourceElement[loopCount], &bitstream[loopCount], constEmptyString,/*assume XML message so no interest in*/ constEmptyString,/* type, set or format*/ constEmptyString, 0,/*Use Queue Manager CCSID & Encoding*/ 0, bitstreamOptions[loopCount]); if (rc==CCI_BUFFER_TOO_SMALL) { free(bitstream[loopCount].pointer); bitstream[loopCount].size=bufLength; bitstream[loopCount].pointer=(CciByte*)malloc(sizeof(CciByte) * bitstream[loopCount].size); bufLength = cniElementAsBitstream(&rc, inSourceElement[loopCount], &bitstream[loopCount], constEmptyString,/*assume XML message so no interest in*/ constEmptyString,/* type, set or format*/ constEmptyString, 0,/*Use Queue Manager CCSID & Encoding*/ 0, bitstreamOptions[loopCount]); } checkRC(rc); bitstream[loopCount].size=bufLength; cniSetElementByteArrayValue(&rc, outBlobElement, &bitstream[loopCount]); checkRC(rc); } /* Get handle of output terminal */ terminalObject = getOutputTerminalHandle( (NODE_CONTEXT_ST *)context, (CciChar*)constOut); /* If the terminal exists and is attached, propagate to it */ if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { /* As this is a new, and changed message, it should be finalized... */ cniFinalize(&rc, outMsg[0], CCI_FINALIZE_NONE); cniFinalize(&rc, outMsg[1], CCI_FINALIZE_NONE); cniFinalize(&rc, outMsg[2], CCI_FINALIZE_NONE); retvalue = cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg[0]); retvalue = cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg[1]); retvalue = cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg[2]); if (retvalue == CCI_FAILURE) { if (rc == CCI_EXCEPTION) { /* Get details of the exception */ memset(&exception_st, 0, sizeof(exception_st)); cciGetLastExceptionData(&rc, &exception_st); /* Any local error handling may go here */ /* Ensure message is deleted prior to return/throw */ cniDeleteMessage(0, outMsg[0]); cniDeleteMessage(0, outMsg[1]); cniDeleteMessage(0, outMsg[2]); /* We must "rethrow" the exception; note this does not return */ cciRethrowLastException(&rc); } else { /* Some other error...the plugin might choose to log it using the CciLog() */ /* utility function */ } } else { } } } else { /* Terminal did not exist...severe internal error. 플러그인은 cciLog() 유틸리티 */ /* log an error here using the cciLog() utility function. */ } /* Delete the messages we created now we have finished with them */ cniDeleteMessage(0, outMsg[0]); cniDeleteMessage(0, outMsg[1]); cniDeleteMessage(0, outMsg[2]); free((void*) constBLOBParserName); free((void*) constBLOBElementName); free((void*) constEmptyString); return;