Analyser un flux RSS (ou toute structure XML) dans une table de données JMP
Problème
Vous souhaitez importer des données XML dans une table de données JMP.
Dans cet exemple, j'utilise le flux RSS de la communauté des utilisateurs JMP pour les compléments trouvés
ici . Vous trouverez ci-dessous un extrait du flux.
Solution
Utilisez la fonction Parse XML JSL pour récupérer le texte de la structure XML et insérer les données dans une table de données JMP.
Il y a trois arguments nommés que vous devez comprendre pour utiliser Parse XML() : Sur l'élément, la balise de début et la balise de fin.
- Sur l'élément : définit quoi faire pour une balise particulière (en utilisant les arguments Start Tag et/ou End Tag)
- Balise de début : définit un script à exécuter lorsque la balise de début (par exemple "") est atteinte. Dans le script Start Tag, vous pouvez accéder à un attribut XML à l'aide de la fonction XML Attr().
- Balise de fin : définit un script à exécuter lorsque la balise de fin (par exemple "
") est atteinte. Dans le script End Tag, vous pouvez accéder au texte d'un élément (c'est-à-dire le texte entre les balises de début et de fin) à l'aide de la fonction XML Text().
L'ordre des arguments On Element que vous incluez dans votre fonction Parse XML n'a pas d'importance. Considérez ces arguments comme définissant ce qui devrait se passer lorsque vous rencontrez chaque élément en parcourant le document de haut en bas.
Le script Start Tag doit être utilisé lorsque vous devez obtenir un Attr() XML à partir d'un élément et lorsque vous devez définir ou créer des variables qui seront définies dans les éléments enfants de l'élément (ou la balise de fin). Le script End Tag doit être utilisé pour récupérer le texte d'un élément XML (entre les balises de début et de fin). Ces scripts de balise de début et de balise de fin sont tous définis avant que JMP ne commence à analyser la chaîne XML réelle. C'est pourquoi l'ordre dans lequel vous les placez n'a pas d'importance, ces scripts sont référencés lorsqu'une balise de début ou de fin est trouvée lors de l'analyse de la chaîne.
Lorsque la fonction Parse XML atteint un élément de la chaîne XML, elle vérifie si un script de balise de début est défini pour cet élément et si c'est le cas, il est évalué. Il fait cela pour chaque élément enfant jusqu'à ce qu'il atteigne une balise de fin pour un élément. Lorsqu'il atteint une balise de fin, il recherche le script End Tag pour cet élément et l'évalue, s'il en existe un.
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() ) )
)
);
Résultat:
Discussion
Ce script est construit spécifiquement pour ce flux RSS, donc votre script pourrait (et sera presque certainement) très différent du script ci-dessus. J'espère que cela vous donne un bon exemple de la façon dont vous pouvez utiliser les variables JSL pour rendre les données disponibles pour les éléments enfants.
Voir également
Guide de script > Extension de JMP > Analyse XML
Selon ce dont vous avez besoin, le Complément d'importation XML pourrait faire tout le travail pour vous (mais il n'utilise pas Parse XML).