Mac De PL/SQL RSS Reader #17 Tweet
RSS Readerの続きです。
さて、RSSリーダーを作る上でもう一つクリアしておきたい課題がある。
それは、各記事のタイトルとURL、公開日以外に、各FEEDのタイトルとURLを取得すること。
BLOGに関して、それぞれの記事のタイトルとURL以外に、BLOGのタイトルとURLも表示したいと考えている。
作成中のRSSリーダーでは、DOMを利用していので、そのBLOGのタイトルとURLもDOMをトラバースして取得することも可能なのだが、ロジックが複雑になるため、BLOGのタイトルとURLに関しては、XPATHを利用して取り出すことにした。
当初、DBMS_XMLPARSER.PARSE(URL)を利用しようとしていたが、URL指定でパースした場合にマルチバイト文字で文字化けが発生したため、UTL_HTTPパッケージとDBMS_XMLPARSER.PARSECLOB(CLOB)を使用して回避している。XPATHを利用しBLOGタイトルとURIの取得テストでは、DBMS_XMLPARSER.PARSE(URL)同様に文字化けするのだが、HttpUriType型を利用してXML(XmlType型)を取り出し、XPATHでBLOGタイトルとURLを取得することにした。
HttpUriType型と、XmlType型の2つはどちらもオブジェクト型である。詳細は、マニュアル「PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス」のXmlTypeとHttpUriType参照のこと。
以下は、RSS 0.92 の FEEDである「AMIS Technorogy blog」のタイトルとURLをXPATHを利用して取り出したもの。シングルバイトなので文字化けは起こらない。楽でいいね〜。マルチバイト文字が含まれていても文字化けしなくなれば、この方法が利用できるようになるので楽なのだが、Oracleさんなんとかして。。。
GLASSCATFISH> set serveroutput on
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://technology.amis.nl/blog/?feed=rss');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/rss/channel/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/rss/channel/link/text()').getStringVal());
9* end;
GLASSCATFISH> /
AMIS Technology blog
http://technology.amis.nl/blog
PL/SQLプロシージャが正常に完了しました。
GLASSCATFISH>
ところが、友人のmegawattさんの「メガ放談」(RSS 0.91) のタイトルとURLをXPATHを利用して取り出すと、タイトルは見事に文字化けする。DBMS_XMLPARSER.PARSE(URL)を利用した場合と同じく文字化けするが、取り出せることは取り出せる。文字化けの回避方法はあるのでとりあえずこのままテスト続行!。
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://megawatt.blogdns.net/blog/rdf91_xml');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/rss/channel/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/rss/channel/link/text()').getStringVal());
9* end;
GLASSCATFISH> /
a?!a?¬a??e≪?
http://megawatt.blogdns.net/blog
PL/SQLプロシージャが正常に完了しました。
3つ目は、RSS 2.0なのだが、RSS 0.9xとは異なりエラーとなる。何故?
幸か不幸か、今回は、RSS 0.9x以外のFEEDフォーマットにも対応しなければならない。
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://miwa2006.exblog.jp/index.xml');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/rss/channel/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/rss/channel/link/text()').getStringVal());
9* end;
GLASSCATFISH> /
declare
*
行1でエラーが発生しました。:
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00225: 要素の終了タグ"item"が開始タグ"title"と一致しません
Error at line 94
中にエラーが発生しました
ORA-06512: "SYS.XMLTYPE", 行5
ORA-06512: "SYS.HTTPURITYPE", 行97
ORA-06512: 行6
GLASSCATFISH>
つづいて、RDF (RSS 1.0)を試す。どちらも、RDFなのだが上手くいかない。しかも、エラーメッセージがそれぞれ異なる。なぜ??
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('https://discus-hamburg.cocolog-nifty.com/mac_de_oracle/index.rdf');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/rdf:RDF/channel/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/rdf:RDF/channel/link/text()').getStringVal());
9* end;
GLASSCATFISH> /
declare
*
行1でエラーが発生しました。:
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00225: 要素の終了タグ"channel"が開始タグ"description"と一致しません
Error at line 42
中にエラーが発生しました
ORA-06512: "SYS.XMLTYPE", 行5
ORA-06512: "SYS.HTTPURITYPE", 行97
ORA-06512: 行6
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://megawatt.blogdns.net/blog/rdf10_xml');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/rdf:RDF/channel/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/rdf:RDF/channel/link/text()').getStringVal());
9* end;
GLASSCATFISH> /
declare
*
行1でエラーが発生しました。:
ORA-30625: NULL SELF引数のメソッド・ディスパッチは使用できません
ORA-06512: 行7
GLASSCATFISH>
最後にATOM。結果は、RSS 2.0、RDF、ATOMは撃沈である。ここでも、エラー内容がそれぞれ異なる。
この方法では、上手くいったのは、RSS 0.9xのみ。 どうする。。 (><)。
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://atsu-log.way-nifty.com/today_s_menu/atom.xml');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/feed/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/feed/link[@type="text/html"]/@href').getStringVal());
9* end;
GLASSCATFISH> /
declare
*
行1でエラーが発生しました。:
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00225: 要素の終了タグ"a"が開始タグ"p"と一致しません
Error at line 30
中にエラーが発生しました
ORA-06512: "SYS.XMLTYPE", 行5
ORA-06512: "SYS.HTTPURITYPE", 行97
ORA-06512: 行6
GLASSCATFISH> l
1 declare
2 v_uri httpUriType;
3 v_xml xmlType;
4 begin
5 v_uri := HttpUriType.createUri('http://www.kaminoge-design.tamabi.ac.jp/faculty/takami/atom.xml');
6 v_xml := v_uri.getXML();
7 dbms_output.put_line(v_xml.extract('/feed/title/text()').getStringVal());
8 dbms_output.put_line(v_xml.extract('/feed/link[@type="text/html"]/@href').getStringVal());
9* end;
GLASSCATFISH> /
declare
*
行1でエラーが発生しました。:
ORA-30625: NULL SELF引数のメソッド・ディスパッチは使用できません
ORA-06512: 行7
GLASSCATFISH>
これらの解決方法は????
エラーメッセージもいろいろ。上記のコードを眺めていても原因は全く浮かばない。
視点を変え、各FEEDのXMLソースを眺めると、RSS 0.9xとRSS2.0、RDF、ATOMのXMLには異なる点があるのみ気付く。それが何か分かりますか? このエラー原因の一なのである。
http://technology.amis.nl/blog/?feed=rss
http://megawatt.blogdns.net/blog/rdf91_xml
http://miwa2006.exblog.jp/index.xml
http://megawatt.blogdns.net/blog/rdf10_xml
http://atsu-log.way-nifty.com/today_s_menu/atom.xml
http://www.kaminoge-design.tamabi.ac.jp/faculty/takami/atom.xml
今日はここまで、次回はこれらの回避方法。
聞いている曲:え〜〜と、iTMSにはこれもありませんでした。。Gloria Estefan & Miami Sound Machine - 1.2.3
| 固定リンク | 0
コメント