fetchでxml(rss2.0)をパースする


WordPress Blogのfeedをjavascriptで扱いたい。

feedをjsonで返すプラグインなんてのもあったんですが、今後のことも考えて使う側でどうにかしたいと思います。

jQueryの$.parseXML()を使うとかなり楽ですが、できればもうjQueryにはかかわらないようにしたい。

fetch APIを使ってXMLを処理してみます。

パース処理

res => res.text() ← fetchで得られるResponsexml()みたいなものがあればよかったんですが、そんなものはないのでtext()で文字列にします。

txt => parser.parseFromString(txt, "text/xml") ← DOMParserでxmlにパース。

doc => doc.querySelectorAll("item") ← XMLからitemをすべて抜き出す。

(ところでこういう処理だとasync / awaitよりもthenチェーンの方が見やすい気がする。)

パース後の抽出処理

後処理はXMLの中身次第ですがワードプレスのフィードを例に書いてみます。

まずはNodeListをArrayにしてmap()処理します。

(list.forEachでもいいんですがArray処理に慣れた今いちいち書くのがめんどい)

このitemのitem.innerHTMLから必要な情報を取ってまわるわけですが結構面倒。

特に本文<content:encoded>はhtmlだとquerySelector("content\\:encoded")で取れるのにxmlだとquerySelector("encoded")でないといけないのはハマった。

中身もよくわからないことになっていたので追加でパースしないといけないし。

また本文中にサムネイルURLが含まれるため<url>があれば別途保存してノードから取り除くみたいな泥臭い処理になってしまいました。

 

Array.map内の処理なので上処理の返値の配列が返ってきます。

色々不格好ではありますがとりあえず必要な情報をjsonで取得できました。

追記:サムネイルについて

なんかほかでサムネイル取得できないなと思ったら、通常のフィードにサムネイルURLがないため自分のブログでは追加してました。

ノーマルなフィードの場合はthumbの部分は除いてください。

 


コメントを残す

メールアドレスが公開されることはありません。