Quando si utilizza la funzione ASBITSTREAM o l'istruzione CREATE FIELD con una clausola PARSE tenere presente i seguenti punti.
La funzione ASBITSTREAM
Se si codifica la funzione ASBITSTREAM con l'opzione della modalità del programma di analisi impostata su RootBitStream, per analizzare una struttura ad albero del messaggio in un flusso di bit, il risultato è un documento MRM nel formato specificato dal formato del messaggio creato dai child dell'elemento di destinazione nel modo usuale.
L'elemento di destinazione deve essere un messaggio predefinito definito all'interno della serie di messaggi o può trattarsi di un messaggio a definizione automatica se si utilizza un formato fisico XML. Questo algoritmo è identico a quello utilizzato per generare il normale flusso di bit di output. Un flusso di bit con formato corretto ottenuto in questo modo può essere utilizzato per creare nuovamente la struttura ad albero originale utilizzando un'istruzione CREATE con una clausola PARSE.
Se si codifica la funzione ASBITSTREAM con l'opzione della modalità del programma di analisi impostata su FolderBitStream, per analizzare una struttura ad albero del messaggio in un flusso di bit, il flusso di bit generato è un elemento MRM creato dall'elemento di destinazione e dai relativi child. A differenza della modalità RootBitStream l'elemento di destinazione non deve rappresentare un messaggio; esso può rappresentare un elemento predefinito all'interno del messaggio o un elemento a definizione automatica all'interno di un messaggio.
Affinché il programma di analisi MRM possa analizzare correttamente il messaggio, il percorso dal messaggio all'elemento di destinazione all'interno del messaggio deve essere specificato nel Tipo messaggio. Il formato del percorso è lo stesso utilizzato dai percorsi del messaggio tranne che il prefisso del tipo di messaggio non è utilizzato.
Message elem1 elem11 elem12
Per serializzare la struttura ad albero secondaria che rappresenta l'elemento elem12 e i relativi child, specificare il percorso del messaggio 'message/elem1/elem12' nel Tipo messaggio.
Se un elemento nel percorso è qualificato da uno spazio dei nomi, specificare l'URI dello spazio dei nomi tra i caratteri {} nel percorso del messaggio. Ad esempio se l'elemento elem1 è qualificato da uno spazio dei nomi 'http://www.ibm.com/temp', specificare il percorso del messaggio come 'message/{http://www.ibm.com/temp}elem1/elem12'
Questa modalità può essere utilizzata per ottenere una descrizione del flusso di bit di strutture ad albero arbitrarie secondarie che appartengono ad un programma di analisi MRM. Quando si opera in questa modalità, con un formato fisico XML, il flusso di bit XML generato non è contenuto nel 'Root Tag Name' specificato per il messaggio nella Serie di messaggi. Non viene creata alcuna dichiarazione XML, anche se non è eliminata nelle proprietà della serie di messaggi.
I flussi di bit ottenuti in questo modo possono essere utilizzati per ricreare la struttura ad albero originale utilizzando un'istruzione CREATE con una clausola PARSE (utilizzando una modalità FolderBitStream).
L'istruzione CREATE con una clausola PARSE
Se si codifica un'istruzione CREATE con una clausola PARSE, con l'opzione della modalità del programma di analisi impostata su RootBitStream, per analizzare un flusso di bit in una struttura ad albero del messaggio, il flusso di bit previsto è un normale documento MRM. Viene creato un campo nella struttura ad albero per ogni campo nel documento. Questo algoritmo è identico a quello utilizzato durante l'analisi di un flusso di bit da un nodo di input
Se si codifica un'istruzione CREATE con una clausola PARSE, con l'opzione della modalità del programma di analisi impostata su FolderBitStream, per analizzare un flusso di bit in una struttura ad albero del messaggio, il flusso di bit previsto è un documento nel formato specificato dal Formato del messaggio, che è specificato direttamente o ereditato. A differenza della modalità RootBitStream la root del documento non deve rappresentare un messaggio MRM; essa può rappresentare un elemento predefinito all'interno di un messaggio o un elemento a definizione automatica all'interno di un messaggio.
Affinché il programma di analisi MRM possa analizzare correttamente il messaggio, il percorso dal messaggio all'elemento di destinazione all'interno del messaggio deve essere specificato nel Tipo messaggio. Il formato del percorso del messaggio è lo stesso di quello utilizzato dalla funzione ASBITSTREAM sopra descritta.
Il seguente ESQL utilizza la definizione del messaggio sopra descritta. L'ESQL serializza parte della struttura ad albero di input utilizzando la funzione ASBITSTREAM e quindi utilizza l'istruzione CREATE con una clausola PARSE per creare nuovamente la struttura ad albero secondaria dell'albero di output. Il messaggio Input e il messaggio Output corrispondente sono riportati sotto il codice ESQL.
CREATE COMPUTE MODULE DocSampleFlow_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); -- Impostare le opzioni che dovranno essere utilizzate da ASBITSTREAM e CREATE ... PARSE -- su FolderBitStream e abilitare la convalida DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent, ValidateValue, ValidateLocalError); -- Serializzare l'elemento elem12 e i relativi child dal flusso di bit di input -- in una variabile DECLARE subBitStream BLOB CAST(ASBITSTREAM(InputRoot.MRM.elem1.elem12 OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1') AS BLOB); -- Impostare il valore del primo elemento nella struttura ad albero di output SET OutputRoot.MRM.elem1.elem11 = 'val11'; -- Analizzare la struttura ad albero secondaria nell'albero di output IF subBitStream IS NOT NULL THEN CREATE LASTCHILD OF OutputRoot.MRM.elem1 PARSE ( subBitStream OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1'); END IF; -- Convertire i child di elem12 nell'albero di output in maiuscolo SET OutputRoot.MRM.elem1.elem12.elem121 = UCASE(OutputRoot.MRM.elem1.elem12.elem121); SET OutputRoot.MRM.elem1.elem12.elem122 = UCASE(OutputRoot.MRM.elem1.elem12.elem122); -- Impostare il valore dell'ultimo elemento nell'albero di output SET OutputRoot.MRM.elem1.elem13 = 'val13'; RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; END MODULE;
<message> <elem1> <elem11>value11</elem11> <elem12> <elem121>value121</elem121> <elem122>value122</elem122> </elem12> <elem13>value13</elem13> </elem1> </message>
<message> <elem1> <elem11>val11</elem11> <elem12> <elem121>VALUE121</elem121> <elem122>VALUE122</elem122> </elem12> <elem13>val13</elem13> </elem1 </message