Conversione di un messaggio XML semplice

Quando si crea il codice ESQL per un nodo Compute, utilizzare l'istruzione SELECT per convertire i messaggi semplici.

Esempi

Consultare gli esempi riportati di seguito e modificarli in base alle proprie necessità. Tutti gli esempi si basano sul messaggio Invoice come input.

Considerare il seguente codice ESQL:

 SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity, R.Author FROM InputRoot.XML.Invoice.Purchases.Item[] AS R);

Quando il messaggio Invoice viene elaborato da questo ESQL, viene creato il seguente messaggio di output:

<Data>
  <Output>
     <Quantity>2</Quantity>
     <Autho>Neil Bradley</Autho>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Autho>Don Chamberlin</Autho>
  </Output>
  <Output>
     <Quantity>1</Quantity>
     <Autho>Philip Heller, Simon Roberts</Autho>
  </Output>
</Data>

Sono disponibili tre campi Output, uno per ciascun campo Item. Ciò si verifica perché, per impostazione predefinita, SELECT crea un elemento nel proprio elenco di risultati per ciascun elemento descritto dall'elenco FROM. All'interno di ciascun campo Output, esiste un Field per ciascun campo indicato nella clausola SELECT e questi sono nell'ordine in cui vengono specificati all'interno di SELECT, non nell'ordine in cui sono visualizzati nel messaggio in arrivo.

La variabile R introdotta dalla parola chiave AS finale è conosciuta come nome della correlazione. E' una variabile locale che rappresenta ciascuno dei campi indicati dalla clausola FROM. Non ha alcun significato per il nome scelto. Riepilogando, questa semplice conversione esegue due operazioni:

  1. Elimina i campi non desiderati.
  2. Garantisce l'ordine dei campi.

Di seguito è riportata la stessa conversione implementata da un algoritmo procedurale:

DECLARE i INTEGER 1;
DECLARE count INTEGER CARDINALITY(InputRoot.XML.Invoice.Purchases.Item[]);

WHILE (i <= count)
   SET OutputRoot.XML.Data.Output[i].Quantity = InputRoot.XML.Invoice.Purchases.Item[i].Quantity;
   SET OutputRoot.XML.Data.Output[i].Author   = InputRoot.XML.Invoice.Purchases.Item[i].Author;
   SET i = i+1;
END WHILE;

Tali esempi illustrano che la versione SELECT della conversione è molto più breve. Inoltre, viene eseguita più rapidamente.

L'esempio riportato di seguito illustra una conversione più avanzata:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author 
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

In questa conversione, una clausola AS è associata a ciascun elemento nella clausola SELECT. Ciò assegna a ciascun campo nel risultato un nome esplicito invece dei nomi dei campi ereditati dall'input. Tali nomi possono essere percorsi (un elenco di nomi separati da punti), come illustrato nell'esempio. Quindi, la struttura del messaggio di output può essere differente da quella del messaggio di input. Utilizzando lo stesso messaggio Invoice, il risultato è:

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>

<Data>
  <Output>
    <Book>
      <Quantity>2</Quantity>
      <Author>Neil Bradley</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Don Chamberlin</Author>
    </Book>
  </Output>
  <Output>
    <Book>
      <Quantity>1</Quantity>
      <Author>Philip Heller, Simon Roberts</Author>
    </Book>
  </Output>
</Data> 

Le espressioni nella clausola SELECT possono essere di qualsiasi complessità e non esistono particolari limitazioni. Possono includere operatori, funzioni, letterali e possono fare riferimento a variabili o campi non relativi al nome della correlazione. L'esempio riportato di seguito illustra espressioni più complesse:

SET OutputRoot.XML.Data.Output[] =
    (SELECT 'Start'                          AS Header,
            'Number of books:' || R.Quantity AS Book.Quantity, 
            R.Author || ':Name and Surname'  AS Book.Author,
            'End'                            AS Trailer
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

Utilizzando lo stesso messaggio Invoice, il risultato in questo caso è:

<Data>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:2</Quantity>
   <Author>Neil Bradley:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Don Chamberlin:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
 <Output>
  <Header>Start</Header>
  <Book>
   <Quantity>Number of books:1</Quantity>
   <Author>Philip Heller, Simon Roberts:Name and Surname</Author>
  </Book>
  <Trailer>End</Trailer>
 </Output>
</Data>

Come illustrato in precedenza, le clausole AS della clausola SELECT contengono un percorso che descrive il nome completo del campo da creare nel risultato. Tali percorsi possono anche specificare (come è normale per i percorsi) il tipo di campo da creare. La seguente conversione di esempio specifica i tipi di dati. In questo caso, i dati con tag XML vengono convertiti in attributi XML:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity.* AS Book.(XML.Attribute)Quantity, 
            R.Author.*   AS Book.(XML.Attribute)Author
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
    );

Utilizzando lo stesso messaggio Invoice, il risultato è:

<Data>
 <Output>
  <Book Quantity="2" Author="Neil Bradley"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Don Chamberlin"/>
 </Output>
 <Output>
  <Book Quantity="1" Author="Philip Heller, Simon Roberts"/>
 </Output>
</Data>

Infine, è possibile utilizzare una clausola WHERE per eliminare alcuni risultati. Nell'esempio riportato di seguito, viene utilizzata una clausola WHERE per rimuovere i risultati in cui viene soddisfatto un criterio specifico. Viene incluso o escluso un intero risultato:

SET OutputRoot.XML.Data.Output[] =
    (SELECT R.Quantity AS Book.Quantity, 
            R.Author   AS Book.Author
            FROM InputRoot.XML.Invoice.Purchases.Item[] AS R
            WHERE R.Quantity = 2
     );

Utilizzando lo stesso messaggio di input, il risultato è:

<Data>
 <Output>
  <Book>
   <Quantity>2</Quantity>
   <Author>Neil Bradley</Author>
  </Book>
 </Output>
</Data>
Concetti correlati
Panoramica dei flussi di messaggi
Panoramica di ESQL
Creazione di modelli di messaggio
Attività correlate
Progettazione di un flusso di messaggi
Definizione del contenuto del flusso di messaggi
Gestione dei file ESQL
Riferimenti correlati
Nodo Compute
Nodo Database
Nodo Filter
Riferimento ESQL
Funzione CARDINALITY
Istruzione DECLARE
Funzione SELECT
Istruzione SET
Istruzione WHILE
Messaggio di esempio
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak05740_