Vorbereitungen:
Die benutzerdefinierten Knoten müssen häufig auf die Inhalte der Nachrichten zugreifen, die im Eingabeterminal empfangen wurden. 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)); ... }
cniCopyElementTree(&rc, sourceElement, targetElement);
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.
Wenn Ihr benutzerdefinierter Rechenknoten hauptsächlich mit ESQL arbeitet, verwenden Sie einen Rechenknoten. Weitere Informationen dazu finden Sie unter Rechenknoten (Compute).
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
Im obigen Beispiel wird mit Hilfe der Funktion cniIsTerminalAttached getestet, ob die Nachricht an das angegebene Terminal weitergegeben werden kann. Wenn Sie die Funktion cniIsTerminalAttached nicht verwenden und das Terminal nicht durch einen Konnektor mit einem anderen Knoten verbunden ist, wird die Nachricht nicht weitergegeben. Es wird auch keine Warnung zurückgegeben. Verwenden Sie die Funktion cniIsTerminalAttached, um dieses Problem zu vermeiden.
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }In diesem Beispiel handelt es sich bei der Methode writeToDevice um eine benutzerdefinierte Methode, die einen Bitstrom in eine Ausgabeeinheit schreibt.
Eine Nachricht kann nur ein Mal serialisiert werden.