Antes de comenzar
En muchos casos, el nodo definido por el usuario necesita acceder al contenido del mensaje recibido en el terminal de entrada. El mensaje se representa como un árbol de elementos de sintaxis. Se proporcionan grupos de funciones de programa de utilidad para la gestión de mensajes, el acceso al almacenamiento intermedio de mensajes, la navegación por los elementos de sintaxis y el acceso a los elementos de sintaxis. (Consulte el apartado Funciones de programa de utilidad de nodo en C si desea ver información detallada sobre las funciones de programa de utilidad.)
Por ejemplo, para consultar el nombre y el tipo del primer hijo del cuerpo:
void cniEvaluate( ... ){ ... /* Navegar hasta el elemento de destino */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Consultar el nombre y el valor del elemento de destino */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
Para acceder a la representación de corriente de bits de un árbol de elementos, puede utilizar la función cniElementAsBitstream. Utilizando esta función, puede obtener la representación de corriente de bits de cualquier elemento en un mensaje. Consulte cniElementAsBitstream para obtener detalles sobre cómo utilizar esta función y código de ejemplo.
Dado que el mensaje de entrada recibido es de sólo lectura, para poder transformar un mensaje deberá escribirlo en un mensaje de salida nuevo utilizando la función cniCreateMessage. Puede copiar los elementos del mensaje de entrada o puede crear elementos nuevos y conectarlos al mensaje. Los elementos nuevos están generalmente en el dominio de un analizador.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser cniCreateElementAsLastChildUsingParser cniCreateElementAfterUsingParser cniCreateElementBeforeUsingParserDeben utilizarse estas funciones porque son específicas para asignar un analizador a una carpeta de árbol de mensaje.
cniCreateElementAsFirstChild cniCreateElementAsLastChild cniCreateElementAfter cniCreateElementBefore
Los nodos pueden invocar expresiones ESQL utilizando la sintaxis ESQL del nodo Compute. Puede crear y modificar los componentes del mensaje utilizando expresiones ESQL y puede hacer referencia a los elementos del mensaje de entrada y de los datos de una base de datos externa utilizando las funciones cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement y cniSqlExecute.
Por ejemplo, para llenar el elemento de resultado a partir del contenido de una columna de una tabla de base de datos:
{ ... sqlExpr = cniSqlCreateStatement(&rc, (NODE_CONTEXT_ST *)context->nodeObject, L"DB", CCI_SQL_TRANSACTION_AUTO, L"SET OutputRoot.XML.Result[] = (SELECT T.C1 AS Col1 FROM Database.TABLE AS T;"); ... cniSqlSelect(&rc, sqlExpr, destinationList, exceptionList, message, outMsg); cniSqlDeleteStatement(&rc, sqlExpr); ... }
Si desea ver más información sobre ESQL, consulte el apartado Visión general de ESQL.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }Un mensaje sólo se puede serializar una vez.