PubMed IDから論文のリストを作ろう（実装編　その２）


##経緯（復習）
研究室の論文管理が煩雑なので，PubMedから情報を収集するフォーマットと，それを簡単に編集できるプログラムを書いたらいいんじゃない？と思い，取り組むことに。するとPubMed IDをアドレスに指定すると，xmlでデータを取得できることを知る。[PubMed IDから論文のリストを作ろう（調査編）](http://qiita.com/items/b2f587281b577042b8ef) JavaScriptのjqueryやajaxをうまく利用すると論文の必要なデータもオンザフライで取得できることが分かった。[PubMed IDから論文のリストを作ろう（実装編　その１）](http://qiita.com/items/065e3a394397dd5c001c)

###ネット上で色々出来たほうが楽しいよね。
[実装編　その１](http://qiita.com/items/065e3a394397dd5c001c)でデータを取得することは出来たのですが，プログラムを書き換えないとPubMed IDが変えられないとか，そいつは実用的じゃないよねん，というわけでインターフェイスを作ることにする。

###JavaScriptの簡単そうなフォームを探せ
後で見た目をこだわるにしても簡単なところから入ったほうが良かろうということでググる。[Java scriptのお勉強　lesson2 ](http://www.mech.tohoku-gakuin.ac.jp/nken/e-learning/javascript/lesson2.html)うむ，簡単そうだ。どれどれ。

>[Java scriptのお勉強　lesson2 ](http://www.mech.tohoku-gakuin.ac.jp/nken/e-learning/javascript/lesson2.html)テキストフィールドに入力された数値を数値変数に変換して，2倍にした値をテキストエリアに出力します。

![obenkyou](https://www.evernote.com/shard/s213/sh/4e89fb2b-a9ef-44e3-a9c1-3e972f5f2283/a87747756833057eb836964e169ddac7/res/d129762f-b1a2-4be7-b2e5-dc277132d742/screenshot.png)

よさげだ。コードお邪魔します。
一部抜粋して掲載させて頂きます。

```html:www.mech.tohoku-gakuin.ac.jp/nken/e-learning/javascript/lesson2.html
<script language="JavaScript"><!--
	function make_text(){
		document.getElementById('output_text').value=""
			+eval(document.getElementById('string1').value)*2+"\n"
	}
// --></script>
</head>
<body bgcolor=white text=gray>
<font color="slateblue"><b>Java scriptのお勉強　lesson2</b></font><br>
<br>
テキストフィールドに入力された数値を数値変数に変換して，2倍にした値をテキストエリアに出力します。

	数値入力：　　　　<input type="text" size=70 id="string1"><br><br>
	<input type="button" value="　計算結果　" onClick="make_text()">　
	<input type=reset value="　リセット　">
	<textarea id="output_text" cols="70" rows="20" WRAP=ON></textarea>

2005　Nagashima Labo.<br><br>
```

`<input type="text" size=70 id="string1">`で入力した値を`make_text`関数内で値を得て数値にして二倍にして`<textarea id="output_text" …`に引き渡していると。分かりやすい。

さあ，これを先ほどのプログラムに利用すっぞ。

```html:outp.html
<h2>Please input PubMed ID(comma-delimited) and push Results button.</h2>
<input type="text" size=70 id="string1"><br><br>
<input type="button" value="Results" onClick="make_text()"><!--クリックしたら，make_text関数を実行-->
<input type="button" value="Reset" onClick="make_blank()"><!--クリックしたら，make_blank関数を実行-->
<br><br><br>
<h2>Publication Lists (Preview)</h2>
<div id="news">Now loading... (If you cannot see this page, 
Please refer to this <a href="news.html">link</a>.
</div>
<br><br>
<h3>HTML</h3>
<textarea id="output_text" cols="70" rows="20" WRAP=ON></textarea><!--htmlの中身を document.getElementById('output_text').value=…　から出力-->
</div>
</div>
<!-- inner --></div>
<!-- contents --></div>
<footer>
<small><img src="../../_shared/img/footer_copy.png" width="147" height="14" alt="（C）H2O Space. Mynavi"></small>
<!-- footer --></footer>

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
var html=''//グローバル変数
function make_text(){

$.ajax({
    url:'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='+document.getElementById('string1').value,//入力値をxmlに入れる//読み出すURL
    dataType:'xml',//受信するデータの種類
    async:true,//非同期通信を有効にするか
    success:function(xml){
        html='';
        $(xml).find('DocSum').each(function(){//DocSumが１つの論文
            var title = $(this).find('Item').filter('[Name^=Title]').text();
            var PubDate = $(this).find('Item').filter('[Name^=PubDate]').text();
            var pubmed = $(this).find('Item').filter('[Name^=pubmed][Type^=String]').text();
            //子ノードがないないものはfilterをかけて属性ごとに取得。
            var authorlist = '';//子ノードがあるものは中身をみる。
            $(this).find('Item').filter('[Name^=AuthorList]').each(function(){
                var authornum = $(this).find('Item').length;//著者数を数えて
                for(var i = 0; i < authornum;i++){
                    var author = $(this).find('Item').eq(i).text();
                    authorlist += author + '.,';//リストに加えていく。
                 }
});
        html += '<li>' + authorlist +' '+ title + ', ' + PubDate + ', ' + '<a href="http://www.ncbi.nlm.nih.gov/pubmed/'+pubmed + '">PubMed:'+pubmed+'</a></li>\n';
        //１つ追記。
    document.getElementById('output_text').value="<ul>"+html+"</ul>\n"
         });//テキストフィールドに入れる。
        $('#news').html('<ul>' + html + '</ul>');//全て追加した所で<div id="news">内に取得
   },
    error: function(html){
        alert('Fell the data loading, Please access later');
    }
});
}

function make_blank(){
    $('#news').html('');//出力値を空に
    document.getElementById('output_text').value="";
}
</script>
```

詳しくはプログラム中を見てほしい。基本的には先程のプログラムで得ていた値をxmlに渡す形に変更して得られたデータを本文中に記載にする形とhtml形式でテキストエリアに出力する形に分けている。

![実行イメージ](https://www.evernote.com/shard/s213/sh/4e89fb2b-a9ef-44e3-a9c1-3e972f5f2283/a87747756833057eb836964e169ddac7/res/c1fe78d6-5b75-43bf-8bf6-0a417f5974c5/screenshot.png)

###おまけ
というか，個人的にはこれが大事なのだけど，microdata出力バージョンも作りました。microdataほにほに，ということは後ほど宣伝したいと思います。

```html:outpmicro.html
<h2>Please input PubMed ID (comma-delimited) and push Results button.</h2><input type="text" size=70 id="string1"><br><br><input type="button" value="Results" onClick="make_text()"><input type="button" value="Results with microdata" onClick="make_micro()"><input type="button" value="Reset" onClick="make_blank()"><br><br><br><h2>Publication Lists (Preview)</h2><div id="news">Now loading... (If you cannot see this page, Please refer to this <a href="news.html">link</a>.</div><br><br><h3>HTML</h3><textarea id="output_text" cols="70" rows="20" WRAP=ON></textarea></div></div><!-- inner --></div><!-- contents --></div><footer><small><img src="../../_shared/img/footer_copy.png" width="147" height="14" alt="（C）H2O Space. Mynavi"></small><!-- footer --></footer><script type="text/javascript" src="js/jquery.js"></script><script type="text/javascript">var html=''//グローバル変数function make_text(){$.ajax({    url:'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='+document.getElementById('string1').value,//22674858,22434880',//読み出すURL    dataType:'xml',//受信するデータの種類    async:true,//非同期通信を有効にするか    success:function(xml){        html='';        $(xml).find('DocSum').each(function(){//DocSumが１つの論文            var title = $(this).find('Item').filter('[Name^=Title]').text();            var PubDate = $(this).find('Item').filter('[Name^=PubDate]').text();            var pubmed = $(this).find('Item').filter('[Name^=pubmed][Type^=String]').text();            //子ノードがないないものはfilterをかけて属性ごとに取得。            var authorlist = '';//子ノードがあるものは中身をみる。            $(this).find('Item').filter('[Name^=AuthorList]').each(function(){                var authornum = $(this).find('Item').length;//著者数を数えて                for(var i = 0; i < authornum;i++){                    var author = $(this).find('Item').eq(i).text();                    authorlist += author + '.,';//リストに加えていく。                 }});        html += '<li>' + authorlist +' '+ title + ', ' + PubDate + ', ' + '<a href="http://www.ncbi.nlm.nih.gov/pubmed/'+pubmed + '">PubMed:'+pubmed+'</a></li>';        //１つ追記。         });        $('#news').html('<ul>' + html + '</ul>');//全て追加した所で<div id="news">内に取得        document.getElementById('output_text').value="<ul>"+html+"</ul>\n"//+document.getElementById('string1').value   },    error: function(html){        alert('Fell the data loading, Please access later');    }});}function make_micro(){$.ajax({    url:'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='+document.getElementById('string1').value,//22674858,22434880',//読み出すURL    dataType:'xml',//受信するデータの種類    async:true,//非同期通信を有効にするか    success:function(xml){        html='';        $(xml).find('DocSum').each(function(){//DocSumが１つの論文            var title = $(this).find('Item').filter('[Name^=Title]').text();            var PubDate = $(this).find('Item').filter('[Name^=PubDate]').text();            var pubmed = $(this).find('Item').filter('[Name^=pubmed][Type^=String]').text();            //子ノードがないないものはfilterをかけて属性ごとに取得。            var authorlist = '';//子ノードがあるものは中身をみる。            $(this).find('Item').filter('[Name^=AuthorList]').each(function(){                var authornum = $(this).find('Item').length;//著者数を数えて                for(var i = 0; i < authornum;i++){                    var author = $(this).find('Item').eq(i).text();                    authorlist += author + '.,';//リストに加えていく。                 }});        html += '<li>' + authorlist +' '+ title + ', ' + PubDate + ', ' + '<meta itemprop=\'reference\' content=\'pmid:'+pubmed+'\' \\><a href="http://www.ncbi.nlm.nih.gov/pubmed/'+pubmed + '">PubMed:'+pubmed+'</a></li>\n';        //１つ追記。         });        $('#news').html('<ul>' + html + '</ul>');//全て追加した所で<div id="news">内に取得    document.getElementById('output_text').value='<ul itemscope itemtype="http://schema.org/BiologicalDatabaseEntry">'+html+"</ul>\n"//+document.getElementById('string1').value   },    error: function(html){        alert('Fell the data loading, Please access later');    }});}function make_blank(){    $('#news').html('');    document.getElementById('output_text').value="";}</script>
```


![実行結果イメージ](https://www.evernote.com/shard/s213/sh/4e89fb2b-a9ef-44e3-a9c1-3e972f5f2283/a87747756833057eb836964e169ddac7/res/ba4df315-cb09-4a5d-836d-d6cf74cca7df/screenshot.png)