jQueryの$.get()でXMLを操作する
個人的にはjQueryを利用して新規のAjax処理を作る場合はJSONを使うのがほとんどですが、「RSSフィードを利用してあれこれしたい」とか「既存のサービスでも利用してるXMLで連携してどうこう」とか、X(HT)MLを連携に使いたい場合もまだまだ多いと思います。
が、普段JSONを利用してると「受信してきたX(HT)MLのDOMをどう操作するんだっけ?」と思い出せなくなることもあるので、備忘録としてまとめておきます。
結論からいくと、
var title = $('#anyElement>title', domObj).text();
のようにjQuery()の第2引数に操作したいDOMオブジェクトを指定することで実現できます。
サンプルとして、RSS2.0フィードを$.getで受信して記事のタイトルと概要を一覧にしてみます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>$.get()でXMLを操作する@UCWD-Studio.</title> </head> <body> <div><input type="button" id="get" value="getRSS2.0" /></div> <div id="viewer"></div> <script type="text/javascript" src="https://ucwd.jp/wp-includes/js/jquery/jquery.js"></script> <script type="text/javascript"> $( function () { $('#get').click( function () { $.get( 'https://ucwd.jp/feed', function (res) { $('#viewer').html('<dl id="resResult"></dl>'); $('item', res).each(function (i) { var title = $('item>title', res).eq(i); var link = $('item>link', res).eq(i); var desc = $('item>description', res).eq(i); $('#resResult').append( '<dt><a>' + title.text() + '</a></dt>' + '<dd>' + desc.text() + '</dd>' ); $('#resResult>dt>a').eq(i).attr('href', link.text()); }); } ); }); }); </script> </body> </html>
RSSフィードのDOM操作で気にしてすべき点は、単純に
var title = $('title', res).text();
でテキストノードを取得するとchannel > title要素の内容を含めた全てのtitle要素を拾ってきてしまうので、とりあえず親要素のitemの数だけeachで繰り返しつつ、何個目のitem > title要素を取得するのかを指定しながら処理します。
オライリージャパンのjQueryクックブックにも書かれてる内容ではあるのですけど、一応サンプルコードの実行例を確認できるページも用意したので、合わせて確認してみてください。