Analisi di un feed RSS (o qualsiasi struttura XML) in una tabella dati JMP
Problema
Hai alcuni dati XML che desideri importare in una tabella dati JMP.
In questo esempio, sto utilizzando il feed RSS della comunità degli utenti JMP per i componenti aggiuntivi trovati
Qui . Di seguito è riportato uno snippet del feed.
Soluzione
Utilizzare la funzione Parse XML JSL per acquisire il testo dalla struttura XML e inserire i dati in una tabella dati JMP.
Esistono tre argomenti denominati che è necessario comprendere per utilizzare Parse XML(): On Element, Start Tag e End Tag.
- Sull'elemento : definisce cosa fare per un particolare tag (usando gli argomenti Start Tag e/o End Tag)
- Inizia tag : definisce uno script da eseguire quando viene raggiunto il tag di inizio (es. ""). All'interno dello script Start Tag è possibile accedere a un attributo XML utilizzando la funzione XML Attr().
- Fine etichetta : definisce uno script da eseguire quando viene raggiunto il tag finale (ad esempio "
"). All'interno dello script End Tag, puoi accedere al testo di un elemento (cioè il testo tra i tag di inizio e fine) utilizzando la funzione XML Text().
L'ordine degli argomenti On Element inclusi nella funzione Parse XML non ha importanza. Pensa a questi argomenti come a definire cosa dovrebbe accadere quando incontri ogni elemento guardando il documento dall'alto verso il basso.
Lo script Start Tag deve essere utilizzato quando è necessario ottenere un XML Attr() da un elemento e quando è necessario impostare o creare variabili che verranno impostate all'interno degli elementi figlio degli elementi (o End Tag). Lo script End Tag dovrebbe essere utilizzato per acquisire un testo di elementi XML (tra i tag di inizio e di fine). Questi script di tag iniziale e tag finale vengono tutti definiti prima che JMP inizi ad analizzare la stringa XML effettiva. Questo è il motivo per cui l'ordine in cui li inserisci non ha importanza, a questi script viene fatto riferimento quando viene trovato un tag di inizio o di fine durante l'analisi della stringa.
Quando la funzione Parse XML raggiunge un elemento nella stringa XML, controlla se è presente uno script Start Tag definito per quell'elemento e, in caso affermativo, viene valutato. Lo fa per ogni elemento figlio finché non raggiunge un tag finale per un elemento. Quando raggiunge un tag di fine, cerca lo script del tag di fine per quell'elemento e lo valuta, se ne esiste uno.
rssFeed_str = Load Text File( "https://community.jmp.com/kvoqx44227/rss/board?board.id=add-ins" );
// create the data table. could also do this in the
dt = New Table( "RSS Data",
New Column( "ChannelTitle", "Character" ),
New Column( "ChannelPubDate", "Character" ),
New Column( "ChannelLink", "Character" ),
New Column( "ChannelDescription", "Character" ),
New Column( "Title", "Character" ),
New Column( "Link", "Character" ),
New Column( "Description", "Character" ),
New Column( "PubDate", "Character" ),
New Column( "Creator", "Character" )
);
// boolean value to know if we are in an item tag
inItem = 0;
Parse XML( rssFeed_str,
On Element(
"item",
Start Tag(
// turn on the inItem flag
// this is needed to differentiate between
// tags for the channel and ones for and item
inItem = 1;
// ad a row to the data table
dt << Add Rows( 1 );
// add row data to the data table for the channel
dt:ChannelTitle = channel_title;
dt:ChannelPubDate = channel_pubDate;
dt:ChannelLink = channel_link;
dt:ChannelDescription = channel_description;
),
End Tag(
// reset the inItem flag
inItem = 0;
)
),
on element(
"title",
End Tag(
// since the title tag exists for both the channel and each item,
// we want to preserve the channel title separately from the
// current item's title
// This same logic is used for the remaining elements
If( inItem == 0,
channel_title = XML Text(),
dt:Title = XML Text()
)
)
),
on element(
"link",
End Tag(
If( inItem == 0,
channel_link = XML Text(),
dt:Link = XML Text()
)
)
),
on element(
"description",
End Tag(
If( inItem == 0,
channel_description = XML Text(),
dt:Description = XML Text()
)
)
),
on element(
"pubDate",
End Tag(
If( inItem == 0,
channel_pubDate = XML Text(),
dt:PubDate = XML Text()
)
)
),
on element(
"dc:creator",
End Tag( If( inItem == 1, dt:Creator = XML Text() ) )
)
);
Risultato:
Discussione
Questo script è stato creato appositamente per questo feed RSS, quindi il tuo script potrebbe (e quasi sicuramente sarà) molto diverso dallo script precedente. Spero che questo ti dia un buon esempio di come utilizzare le variabili JSL per rendere disponibili i dati per gli elementi figlio.
Guarda anche
Guida allo scripting > Estensione di JMP > Analisi XML
A seconda di ciò di cui hai bisogno, il Componente aggiuntivo importatore XML potrebbe fare tutto il lavoro per te (ma non utilizza Parse XML).