Vorbereitungen:
In vielen Fällen muss der benutzerdefinierte Knoten auf den Inhalt der Nachricht zugreifen, die an seinem Eingabeterminal empfangen wurde. Die Nachricht wird als Baumstruktur aus Syntaxelementen dargestellt. Gruppen von Dienstprogrammfunktionen werden für das Nachrichtenmanagement, den Zugriff auf Nachrichtenpuffer, die Navigation durch Syntaxelemente und den Zugriff auf Syntaxelemente bereitgestellt. (Weitere Informationen zu den Dienstprogrammfunktion finden Sie unter Dienstprogrammfunktionen für C-Knoten.)
So fragen Sie beispielsweise den Namen und den Typ des ersten untergeordneten Elements des Hauptteils ab:
void cniEvaluate( ... ){ ... /* Navigate to the target element */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Query the name and value of the target element */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
Mit der Funktion 'cniElementAsBitstream' können Sie auf die Bitstromdarstellung einer Elementbaumstruktur zugreifen. Sie können damit die Bitstromdarstellung jedes Elements in einer Nachricht abrufen. Informationen zur Verwendung dieser Funktion und des Mustercodes finden Sie untercniElementAsBitstream.
Die empfangene Eingabenachricht ist schreibgeschützt, deshalb müssen Sie sie mit Hilfe der Funktion cniCreateMessage in eine neue Ausgabenachricht schreiben, bevor sie umgewandelt werden kann. Sie können Elemente aus der Eingabenachricht kopieren, oder Sie können neue Elemente erstellen und diese an die Nachricht anhängen. Neue Elemente befinden sich im Allgemeinen in der Domäne eines Parsers.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParsercniCreateElementAsLastChildUsingParsercniCreateElementAfterUsingParsercniCreateElementBeforeUsingParserDiese Funktionen sollten verwendet werden, weil sie speziell für das Zuweisen eines Parsers zu einer Nachrichtenbaumstruktur vorgesehen sind.
cniCreateElementAsFirstChildcniCreateElementAsLastChildcniCreateElementAftercniCreateElementBefore
Knoten können ESQL-Ausdrücke mit der ESQL-Syntax des Rechenknotens aufrufen. Sie können die Komponenten der Nachricht unter Verwendung von ESQL-Ausdrücken erstellen und ändern, und Sie können mit Hilfe der Funktionen cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement und cniSqlExecute auf Elemente der Eingabenachricht und Daten aus einer externen Datenbank verweisen.
So füllen Sie beispielsweise das Element 'Result' (Ergebnis) mit dem Inhalt einer Spalte in einer Datenbanktabelle:
{ ... 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); ... }
Weitere Informationen zu ESQL finden Sie unter Übersicht zu 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)); ... }Eine Nachricht kann nur einmal serialisiert werden.