オブジェクト索引
XMLFeed オブジェクトは、RSS フィードなど、外部から供給される XML 型式のデータを WebRelease のページデータの一部として取り込んで利用したいときに使用するオブジェクトです。
このオブジェクトを使用するためには、下記の準備が必要になります。
「XML リーダ」タイプの要素をテンプレートの展開内で参照すると、参照結果がここで説明している XMLFeed オブジェクトとなります。
XMLFeed オブジェクトに対しては、グループ項目と同じように要素参照を使って構造中の任意の場所にアクセスすることができます。また、ここで説明しているメソッドを呼び出して利用することもできます。
例を使って XMLFeed オブジェクトの使い方を見てみましょう。下記のような XML ファイルにアクセスしてみます。
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns="https://purl.org/rss/1.0/"
xmlns:rdf="https://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="https://purl.org/dc/elements/1.1/">
<channel rdf:about="https://www.frameworks.co.jp/support/examples/">
<title>Example : WebRelease 2 Manual (XMLFeed object)</title>
<link>https://www.frameworks.co.jp/support/examples/examples1.rdf</link>
<description>Example : WebRelease 2 Manual (XMLFeed object)</description>
<dc:language>ja</dc:language>
<dc:rights>(C) Copyright 2006 FrameWorks Software, Inc. All rights reserved.</dc:rights>
<dc:date>2006-08-08T00:00:00+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="https://www.frameworks.co.jp/support/index.html" />
<rdf:li rdf:resource="https://www.frameworks.co.jp/" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="https://www.frameworks.co.jp/support/index.html">
<title>RSS 1.0 型式のフィード中の 1 つめの item のタイトルです</title>
<link>https://www.frameworks.co.jp/support/index.html</link>
<description>これは 1 つめの item 要素に定義されている description 要素です。</description>
<dc:date>2006-06-15T00:00:00+09:00</dc:date>
</item>
<item rdf:about="https://www.frameworks.co.jp/">
<title>RSS 1.0 型式のフィード中の 2 つめの item のタイトルです</title>
<link>https://www.frameworks.co.jp/</link>
<description>これは 2 つめの item 要素に定義されている description 要素です。</description>
<dc:date>2006-06-13T00:00:00+09:00</dc:date>
</item>
</rdf:RDF>
この XML ファイルは RSS1.0 型式の RSS フィードファイルです。このサンプルファイルは下記の URL にサンプルとして置かれています。
https://www.frameworks.co.jp/support/examples/example1.rdf
このフィードを取り込んで「リンク付きタイトルリスト」を生成してみましょう。
まず、XML データを取り込む準備をします。XML データを WebRelease のページデータの一部として利用するためには XML リーダ 型の要素を使用する必要があります。
XMLリーダ型の要素を持ったテンプレートを作成してください。テンプレート名はなんでも構いませんが、要素名は、ここでは説明の都合上 feed としておきましょう。もちろん、実際に XMLリーダ型の要素を使ってテンプレートを作成される場合は、要素名は自由に決めていただいて構いません。
そのテンプレートでページを1ページ作成します。作成したページの編集画面で feed の URL 欄に上記の XML ファイルが取得できる URL を指定します。
これでこの XML ファイルをページデータに取り込んで利用する準備ができました。
この RSS1.0 フィードを取り込んで簡単なタイトルリストを生成するための展開の記述は下記のとおりです。先ほど作成したテンプレートの展開に、下記のコードを書き込んでページを preview してみてください。取り込んだ XML ファイルから作成されたタイトルリストが表示されるでしょう。
<html>
<body>
<h2>item のリスト</h2>
<h4>%feed.channel.title%</h4>
<p>%feed.channel.dc:rights%</p>
<dl>
<wr-for list="feed.item" variable="x">
<dt><a href="%x.link%">%x.title%</a></dt>
<dd>%x.description%</dd>
</wr-for>
</dl>
</body>
</html>
テンプレートの展開の中で XMLリーダ 要素を参照すると、その XMLリーダ が取得した XML データのトップレベルの Element を表わす XMLFeed オブジェクト (Dom に似ています) が得られます。
この例の場合、テンプレートの展開中で feed を参照すると rdf:RDF というタグ名の XML 要素を表わす XMLFeed オブジェクトが得られます。この XMLFeed オブジェクトは URL から取得した XML データと同じ構造を持つグループ項目として扱うことができます。
展開中で feed を参照すると、それは rdf:RDF を表わす XMLFeed オブジェクトを指しています。この XMLFeed オブジェクトは直下に 1 つの channel という要素と 2 つの item という要素をもったグループ項目と同じように扱うことができます。channel と item は、さらにグループ項目です。channel には title link description dc:language dc:rights dc:date items という子要素があります。また、item には title link description dc:date という子要素があります。
feed.item という要素参照を行なうことで XML 中の長さ 2の item の列にアクセスすることができるわけです。
item はくり返しのある要素ですので wr-for を使ってループしながら処理します。この例では item 要素が 2 つあるので feed.item という参照は長さ 2 の列となりますのでループは 2 回実行されることになります。
item 要素がひとつしかない XML データを受け取った場合にはループは 1 回だけ実行されることになります。また、item 要素が 1 つもない XML データを受け取ってしまった場合にはループ内は 1 回も実行されないことになります。
wr-for の内側で x を参照することで個々の item 要素にアクセス可能です。item は title link description dc:date という 4 つの子要素をもったグループ項目として扱うことができます。item から title や link の値を取り出しながらタイトルリストを生成します。
最後に、チャネル情報の表示についても簡単に説明しておきましょう。channel 要素内の title 要素にアクセスする場合は feed.channel.title となります。同様に channel 要素内の dc:rights 要素にアクセスする場合は feed.channel.dc:rights となります。
なれるまで少々難しいかもしれません。受け取る XML データの形状をよく把握して展開を記述すればいろいろな形状の XML データを自由に扱えるようになるでしょう。
RSS フィードのフォーマットの識別が必要であれば、getFeedFormat() メソッドを使えばフィードのフォーマットを知ることができます。フォーマットにしたがって異る展開が必要になりますので、wr-if でそれぞれのフォーマットに対応した展開を作成すれば、複数のフォーマットに対応することができます。
<body>
....
<wr-if condition="feed.getFeedFormat() == \"Atom\"">
.... Atom 用の展開....
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"RSS1.0\"">
.... RSS1.0 用の展開....
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"RSS2.0\"">
.... RSS2.0 用の展開....
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"Unknown\"">
.... フィードのフォーマットが不明な場合の展開(エラーメッセージ)....
</wr-if>
....
</body>
stripTags() という関数があります。この関数を使用すれば description などの要素中にタグや画像が含まれている場合にそれらを選択的に除去することができます。
<html>
<body>
<h2>item のリスト</h2>
<h4>%feed.channel.title%</h4>
<p>%feed.channel.dc:rights%</p>
<dl>
<wr-for list="feed.item" variable="x">
<dt><a href="%x.link%">%x.title%</a></dt>
<dd>%stripTags(x.description)%</dd>
</wr-for>
</dl>
</body>
</html>
タグに付けられている属性を取得したい場合には getAttributeNames() メソッドと getAttributeValue() メソッドを使用することができます。
メソッド名 | 説明 |
---|---|
getAttributeNames() | XML 文書中の要素に付けられている属性の名前のリストを返す |
getAttributeValue(name) | XML 文書中の要素に付けられている属性の値を返す |
getFeedFormat() | XML ファイルのフォーマットを判定する |
getFeedURL() | XML リーダに指定されている URL を返す |
getNodeName() | XML 文書中の要素の名前を返す |
getNodeType() | XML 文書中の要素のタイプ名を返す |
このメソッドはレシーバとなっている XMLFeed オブジェクトが表わしている XML 文書中の要素に付けられている属性の名前のリストを返します。
このページの最初の説明の部分で使用した例を考えます。getAttributeNames() メソッドの利用例を追加してあります。
<html>
<body>
<h2>item のリスト</h2>
<!-- getAttributeNames() メソッドの利用例-->
<wr-for list="feed.getAttributeNames()" variable="x">
%x%<br>
</wr-for>
<!-- 利用例おわり -->
<h4>%feed.channel.title%</h4>
<p>%feed.channel.dc:rights%</p>
<dl>
<wr-for list="feed.item" variable="x">
<dt><a href="%x.link%">%x.title%</a></dt>
<dd>%x.description%</dd>
</wr-for>
</dl>
</body>
</html>
この例では、getAttributeNames() メソッドを feed をレシーバにして呼び出しています。結果として、トップレベルの rdf:RDF 要素に付けられている属性の名前の一覧が得られます。
このメソッドはレシーバとなっている XMLFeed オブジェクトが表わしている XML 文書中の要素に付けられている属性の値を返します。
取り出したい属性名を指定します。
指定された属性がレシーバに定義されていない場合には空文字列が返されます。
このページの最初の説明の部分で使用した例を考えます。getAttributeValue() メソッドの利用例を追加してあります。
<html>
<body>
<h2>item のリスト</h2>
<!-- getAttributeValue() メソッドの利用例-->
<wr-for list="feed.getAttributeNames()" variable="x">
%x% = [%feed.getAttributeValue(x)%]<br>
</wr-for>
<!-- 利用例おわり -->
<h4>%feed.channel.title%</h4>
<p>%feed.channel.dc:rights%</p>
<dl>
<wr-for list="feed.item" variable="x">
<dt><a href="%x.link%">%x.title%</a></dt>
<dd>%x.description%</dd>
</wr-for>
</dl>
</body>
</html>
この例では、getAttributeNames() メソッドで取り出した各属性名について、今度は getAttributeValues() メソッドを使って、その属性に指定されていた値(文字列)を取得して表示しています。
getAttributeValue() メソッドを使って Atom フィードの entry 要素中にある link 要素の href 属性を取り出してリンク先として使用してみます。
<body>
....
<dl>
<wr-for list="feed.entry" variable="e">
<dt><a href="%e.link.getAttributeValue("href")%">%e.title%</a></dt>
<dd>%stripTags(e.summary)%</dd>
</wr-for>
</dl>
....
</body>
Atom フィード中の entry 要素の直下の link 要素に指定されている href 属性をリンク先として取り出して使用しています。
getFeedFormat() メソッドは、XMLリーダ に指定されている URL から取得した XML ファイルのフォーマットを調べたい時に使用します。
取得した XML ファイルのトップレベルの要素名が rdf:RDF であった場合には、フィードのフォーマットは RSS1.0 であると判断し、文字列 "RSS1.0" を返します。
取得した XML ファイルのトップレベルの要素名が rss であった場合には、フィードのフォーマットは RSS2.0 であると判断し、文字列 "RSS2.0" を返します。
取得した XML ファイルのトップレベルの要素名が feed であった場合には、フィードのフォーマットは Atom であると判断し、文字列 "Atom" を返します。
いずれでもない場合には文字列 "Unknown" が返されます。
テンプレート中に feed という名称で「XMLリーダ」型の要素を定義します。
そのテンプレートを使ってページを作成します。ページ編集画面で URL 欄にどこか RSS フィードを提供しているURL を指定します。(たとえば https://www.frameworks.co.jp/support/examples/example1.rdf など)
インターバルには 1800 や 3600 など、フィードへのアクセス間隔を秒単位で指定しておきます。
下記のような展開の記述で、フィードされてくる XML ファイルのフォーマットを調べることができます。
<body>
....
<wr-if condition="feed.getFeedFormat() == \"RSS1.0\"">
%feed.getFeedURL()% の フィードのフォーマットは RSS 1.0 です。
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"RSS2.0\"">
%feed.getFeedURL()% の フィードのフォーマットは RSS 2.0 です。
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"Atom\"">
%feed.getFeedURL()% の フィードのフォーマットは Atom です。
</wr-if>
<wr-if condition="feed.getFeedFormat() == \"Unknown\"">
%feed.getFeedURL()% の フィードのフォーマットは不明です。
</wr-if>
....
</body>
テンプレートの展開中で XMLリーダ型の要素 feed を参照すると XMLFeed 型のオブジェクトが得られます。feed.getFeedFormat() という記述で XMLFeed オブジェクトの getFeedFormat() メソッドを呼び出します。
getFeedURL() メソッドは、XMLリーダ に指定されている URL を返します。返される URL はページ編集画面の URL 欄に入力されている文字列です。
テンプレート中に feed という名称で「XMLリーダ」型の要素を定義します。
そのテンプレートを使ってページを作成します。ページ編集画面で URL 欄にどこか RSS フィードを提供しているURL を指定します。(たとえば https://www.frameworks.co.jp/support/examples/example1.rdf など)
下記のような展開の記述で、フィードを取りに行く URL を調べることができます。
<body>
....
<p>要素 feed は %feed.getFeedURL()% から XML データを取り込みます。</p>
....
</body>
このメソッドはレシーバとなっている XMLFeed オブジェクトが表わしている XML 文書中の要素の名前(タグ名)を返します。
テンプレート中に feed という名称で「XML リーダ」型の要素を定義します。
そのテンプレートを使ってページを作成します。ページ編集画面で URL 欄にどこか RSS フィードを提供しているURL を指定します。(たとえば https://www.frameworks.co.jp/support/examples/example1.rdf など)
インターバルには 1800 や 3600 など、フィードへのアクセス間隔を秒単位で指定しておきます。
下記のような展開の記述で、取得した XML ファイルのトップレベルの要素の要素名を表示することができます。
<body>
....
%feed.getNodeName()%
....
</body>
フィードが RSS1.0 で与えられている場合には rdf:RDF が表示されるでしょう。RSS2.0 の場合には rss が、また Atom の場合には feed と表示されるはずです。
フィード中に含まれているXML要素を手繰りながら要素の名前を出力してみましょう。
XMLFeed オブジェクトの説明(このページの最初の部分)では、取得した XML データをグループ項目のように扱うことで XML ファイル中のデータにアクセスする方法を説明しました。
XML データに対するアクセス方法は、グループ項目のように扱う方法以外に、配列として扱う方法も使うことができます。この方法で XML データを操作しなければならなくなるケースは少ないと思われますが、下記の例のような展開を使用することも可能です。
<body>
....
<wr-for list="feed" variable="p">
getNodeName() = "%p.getNodeName()%" getNodeType() = "%p.getNodeType()%"<br>
</wr-for>
....
</body>
このコードでは、取得した XML データのトップレベルの要素 (たとえば RSS1.0 の場合には rdf:RDF 要素になります) の直下の要素を先頭から順にスキャンし、その要素の名前とタイプを getNodeName() メソッドと getNodeType() メソッドで取得して表示しています。
表示結果は、たとえば、XML データとして
https://www.frameworks.co.jp/support/examples/example1.rdf
を使用した場合には、
getNodeName() = "#text" getNodeType() = "Text"
getNodeName() = "channel" getNodeType() = "Element"
getNodeName() = "#text" getNodeType() = "Text"
getNodeName() = "item" getNodeType() = "Element"
getNodeName() = "#text" getNodeType() = "Text"
getNodeName() = "item" getNodeType() = "Element"
getNodeName() = "#text" getNodeType() = "Text"
という表示になるでしょう。
getNodeType() メソッドが "Element" であると答えている XMLFeed オブジェクトは XML ファイル中のタグに対応しています。"Text" と答えている部分は、タグとタグの間にある文字列に対応しています。このサンプルデータの場合、この "Text" の部分はスペースと改行記号です。例えば、一つめの item 要素の閉じタグと二つめの item 要素の開始タグの間にスペースや改行があるため、そこに "Text" タイプの要素があると解釈されているわけです。
このように、XML データを名前でアクセスせずに、先頭からスキャンしながらアクセスする場合には、対象としている XMLFeed オブジェクトが XML データ中のどのタグに対応しているのかを知る方法が必要になります。この getNodeName() メソッドを使って、名前が判らない XMLFeed オブジェクトから、対応するタグの名前を取り出すことができます。また、getNodeType() メソッドを使えば、対象としている XMLFeed オブジェクトが対応している XML ファイル上の部分(タグなのか、タグとタグの間のテキストなのかなど)を知ることができます。
このメソッドはレシーバとなっている XMLFeed オブジェクトが表わしている XML 文書中の要素のタイプ名を返します。
返される値は以下のいずれかです。
getNodeName() メソッドの利用例を参照してください。