Parsen eines RSS-Feeds (oder einer beliebigen XML-Struktur) in eine JMP-Datentabelle
Problem
Sie haben einige XML-Daten, die Sie in eine JMP-Datentabelle importieren möchten.
In diesem Beispiel verwende ich den RSS-Feed der JMP User Community für gefundene Add-Ins
Hier . Unten finden Sie einen Ausschnitt des Feeds.
Lösung
Verwenden Sie die JSL-Funktion Parse XML, um den Text aus der XML-Struktur abzurufen und die Daten in eine JMP-Datentabelle einzufügen.
Es gibt drei benannte Argumente, die Sie verstehen müssen, um Parse XML() zu verwenden: On Element, Start Tag und End Tag.
- Auf Element : Definiert, was für ein bestimmtes Tag zu tun ist (unter Verwendung der Argumente Start-Tag und/oder End-Tag)
- Tag starten : Definiert ein Skript, das ausgeführt wird, wenn das Start-Tag (z. B. „“) erreicht wird. Innerhalb des Start-Tag-Skripts können Sie mit der Funktion XML Attr() auf ein XML-Attribut zugreifen.
- End-Tag : Definiert ein Skript, das ausgeführt wird, wenn das End-Tag (z. B. „
“) erreicht ist. Innerhalb des End-Tag-Skripts können Sie mit der XML-Funktion Text() auf den Text eines Elements (dh den Text zwischen den Start- und End-Tags) zugreifen.
Die Reihenfolge der On-Element-Argumente, die Sie in Ihre XML-Analysefunktion einschließen, spielt keine Rolle. Stellen Sie sich diese Argumente so vor, dass sie definieren, was passieren soll, wenn Sie auf jedes Element stoßen, wenn Sie das Dokument von oben nach unten durchsuchen.
Das Start-Tag-Skript sollte verwendet werden, wenn Sie ein XML Attr() von einem Element abrufen müssen und wenn Sie Variablen festlegen oder erstellen müssen, die innerhalb der untergeordneten Elemente (oder des End-Tags) des Elements festgelegt werden. Das End-Tag-Skript sollte verwendet werden, um einen XML-Elementtext (zwischen den Start- und End-Tags) abzurufen. Diese Start-Tag- und End-Tag-Skripte werden alle definiert, bevor JMP mit dem Parsen der eigentlichen XML-Zeichenfolge beginnt. Aus diesem Grund spielt die Reihenfolge, in der Sie sie eingeben, keine Rolle. Auf diese Skripte wird verwiesen, wenn beim Parsen der Zeichenfolge ein Start- oder End-Tag gefunden wird.
Wenn die Funktion „XML analysieren“ ein Element in der XML-Zeichenfolge erreicht, prüft sie, ob für dieses Element ein Start-Tag-Skript definiert ist, und wenn ja, wird es ausgewertet. Dies wird für jedes untergeordnete Element durchgeführt, bis ein End-Tag für ein Element erreicht wird. Wenn ein End-Tag erreicht wird, sucht es nach dem End-Tag-Skript für dieses Element und wertet es aus, sofern eines vorhanden ist.
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() ) )
)
);
Ergebnis:
Diskussion
Dieses Skript wurde speziell für diesen RSS-Feed erstellt, daher kann (und wird mit ziemlicher Sicherheit) Ihr Skript stark vom obigen Skript abweichen. Ich hoffe, dies ist ein gutes Beispiel dafür, wie Sie JSL-Variablen verwenden können, um Daten für untergeordnete Elemente verfügbar zu machen.
Siehe auch
Skripthandbuch > JMP erweitern > XML analysieren
Je nachdem, was Sie benötigen, die XML-Importer-Add-In könnte die ganze Arbeit für Sie erledigen (aber es verwendet kein Parse XML).