Analizar una fuente RSS (o cualquier estructura XML) en una tabla de datos JMP
Problema
Tiene algunos datos XML que desea importar a una tabla de datos JMP.
En este ejemplo, estoy usando el canal RSS de la comunidad de usuarios de JMP para los complementos encontrados.
aquí . A continuación se muestra un fragmento del feed.
Solución
Utilice la función Parse XML JSL para tomar el texto de la estructura XML e insertar los datos en una tabla de datos JMP.
Hay tres argumentos con nombre que debe comprender para utilizar Parse XML(): en elemento, etiqueta de inicio y etiqueta de fin.
- En elemento : define qué hacer con una etiqueta en particular (usando los argumentos Etiqueta de inicio y/o Etiqueta de fin)
- Etiqueta de inicio : define un script que se ejecutará cuando se alcance la etiqueta de inicio (por ejemplo, ""). Dentro del script de etiqueta de inicio, puede acceder a un atributo XML utilizando la función XML Attr().
- Etiqueta final : define un script que se ejecutará cuando se alcance la etiqueta final (por ejemplo, "
"). Dentro del script de etiqueta final, puede acceder al texto de un elemento (es decir, el texto entre las etiquetas inicial y final) utilizando la función Texto XML().
El orden de los argumentos de On Element que incluye dentro de su función Parse XML no importa. Piense en estos argumentos como una definición de lo que debería suceder cuando encuentre cada elemento mirando el documento de arriba a abajo.
El script de etiqueta de inicio debe usarse cuando necesita obtener un atributo XML () de un elemento y cuando necesita establecer o crear variables que se establecerán dentro de los elementos secundarios (o etiqueta de finalización). El script de etiqueta final debe usarse para capturar texto de elementos XML (entre las etiquetas inicial y final). Estos scripts de etiqueta de inicio y etiqueta de fin se definen antes de que JMP comience a analizar la cadena XML real. Es por eso que el orden en que los coloque no importa; se hace referencia a estos scripts cuando se encuentra una etiqueta de inicio o fin al analizar la cadena.
Cuando la función Parse XML llega a un elemento en la cadena XML, verifica si hay un script de etiqueta de inicio definido para ese elemento y, si lo hay, se evalúa. Hace esto para cada elemento secundario hasta que llega a una etiqueta final para un elemento. Cuando llega a una etiqueta final, busca el script de etiqueta final para ese elemento y lo evalúa, si existe.
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() ) )
)
);
Resultado:
Discusión
Este script está creado específicamente para esta fuente RSS, por lo que su script podría (y casi con seguridad será) muy diferente del script anterior. Espero que esto le brinde un buen ejemplo de cómo puede utilizar variables JSL para que los datos estén disponibles para elementos secundarios.
Ver también
Guía de secuencias de comandos > Ampliación de JMP > Análisis de XML
Dependiendo de lo que necesites, el Complemento Importador XML podría hacer todo el trabajo por usted (pero no utiliza Parse XML).