RSS フィード (または任意の XML 構造) を解析して JMP データ テーブルを作成する
問題
JMP データ テーブルにインポートしたい XML データがあります。
この例では、見つかったアドインに対して JMP ユーザー コミュニティの RSS フィードを使用しています。
ここ。 以下はフィードの抜粋です。
解決
XML JSL の解析関数を使用して、XML 構造からテキストを取得し、そのデータを JMP データ テーブルに挿入します。
Parse XML() を使用するには、要素上、開始タグ、終了タグの 3 つの名前付き引数を理解する必要があります。
- 要素上: 特定のタグに対して何を行うかを定義します (開始タグおよび/または終了タグの引数を使用)
- 開始タグ: 開始タグ (例: "") に到達したときに実行するスクリプトを定義します。 開始タグ スクリプト内では、XML Attr() 関数を使用して XML 属性にアクセスできます。
- 終了タグ: 終了タグ (例: "
") に到達したときに実行するスクリプトを定義します。 終了タグ スクリプト内では、XML Text() 関数を使用して要素のテキスト (つまり、開始タグと終了タグの間のテキスト) にアクセスできます。
Parse XML 関数内に含める On Element 引数の順序は重要ではありません。 これらの引数は、文書を上から下まで見て各要素に遭遇したときに何が起こるかを定義するものであると考えてください。
開始タグ スクリプトは、要素から XML Attr() を取得する必要がある場合、および要素の子要素 (または終了タグ) 内に設定される変数を設定または作成する必要がある場合に使用する必要があります。 XML 要素テキスト (開始タグと終了タグの間) を取得するには、終了タグ スクリプトを使用する必要があります。 これらの開始タグと終了タグのスクリプトはすべて、JMP が実際の XML 文字列の解析を開始する前に定義されます。 これが、スクリプトを配置する順序が重要ではない理由です。これらのスクリプトは、文字列の解析時に開始タグまたは終了タグが見つかったときに参照されます。
XML 解析関数は、XML 文字列内の要素に到達すると、その要素に対して開始タグ スクリプトが定義されているかどうかを確認し、存在する場合は評価されます。 これを、要素の終了タグに到達するまで、子要素ごとに実行します。 終了タグに到達すると、その要素の終了タグ スクリプトを検索し、存在する場合はそれを評価します。
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() ) )
)
);
結果:
議論
このスクリプトはこの RSS フィード専用に構築されているため、あなたのスクリプトは上記のスクリプトとは大きく異なる可能性があります (そしてほぼ間違いなく)。 これが、JSL 変数を利用してデータを子要素で使用できるようにする方法の良い例となることを願っています。
関連項目
スクリプトガイド > JMP の拡張 > XML の解析
必要なものに応じて、 XML インポーター アドインすべての作業を自動的に実行してくれるかもしれません (ただし、Parse XML は使用されません)。