Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-01-20

DAS サーバの DSN を読んでみる

|  DAS サーバの DSN を読んでみる - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  DAS サーバの DSN を読んでみる - KazusaAPI開発日誌  DAS サーバの DSN を読んでみる - KazusaAPI開発日誌 のブックマークコメント

DAS サーバの DSN はこのような XML になっている。

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DASDSN SYSTEM "http://www.biodas.org/dtd/dasdsn.dtd">
<DASDSN>
   <DSN>
      <SOURCE id="Anabaena">Anabaena</SOURCE>
      <MAPMASTER>http://g.kazusa.or.jp/cgi-bin/das/Anabaena</MAPMASTER>
      <DESCRIPTION>Anabaena</DESCRIPTION>
   </DSN>
(以下省略)

これを Ruby で内容をよみとってみる。XML は REXML で処理する。

irb(main):001:0> require 'rubygems'
irb(main):002:0> require 'open-uri'
irb(main):003:0> require 'rexml/document'
irb(main):004:0> url = "http://g.kazusa.or.jp/cgi-bin/das/dsn"
irb(main):005:0> dsn = open(url).read
irb(main):006:0> dsn = REXML::Document.new(dsn)
irb(main):007:0> dsn
=> <UNDEFINED> ... </>
  • REXML::Document.new(str)

XPath でとりだす。MAPMASTER エレメントは DAS サービスのエントリーポイントの URL です。

irb(main):034:0> dsn.get_elements('//DSN').each {|x| 
p x.get_elements('MAPMASTER')[0].text }
"http://g.kazusa.or.jp/cgi-bin/das/Anabaena"
"http://g.kazusa.or.jp/cgi-bin/das/BTAi1"
"http://g.kazusa.or.jp/cgi-bin/das/Bradyrhizobium"
"http://g.kazusa.or.jp/cgi-bin/das/CC9311"
"http://g.kazusa.or.jp/cgi-bin/das/Chlorobium"
"http://g.kazusa.or.jp/cgi-bin/das/Etli"
"http://g.kazusa.or.jp/cgi-bin/das/Gloeobacter"
"http://g.kazusa.or.jp/cgi-bin/das/Leguminosarum"
"http://g.kazusa.or.jp/cgi-bin/das/MED4"
"http://g.kazusa.or.jp/cgi-bin/das/MIT9313"
"http://g.kazusa.or.jp/cgi-bin/das/Mesorhizobium"
"http://g.kazusa.or.jp/cgi-bin/das/NGR234"
"http://g.kazusa.or.jp/cgi-bin/das/ORS278"
"http://g.kazusa.or.jp/cgi-bin/das/ORS571"
"http://g.kazusa.or.jp/cgi-bin/das/PCC6301"
"http://g.kazusa.or.jp/cgi-bin/das/R7A"
"http://g.kazusa.or.jp/cgi-bin/das/Rhodopseudomonas"
"http://g.kazusa.or.jp/cgi-bin/das/SS120"
"http://g.kazusa.or.jp/cgi-bin/das/Sinorhizobium"
"http://g.kazusa.or.jp/cgi-bin/das/Synechocystis"
"http://g.kazusa.or.jp/cgi-bin/das/Thermo"
"http://g.kazusa.or.jp/cgi-bin/das/WH8102"
"http://g.kazusa.or.jp/cgi-bin/das/osa_chr12"
"http://g.kazusa.or.jp/cgi-bin/das/yeast_chr1"
  • REXML::Element#get_elements(xpath)
  • REXML::Element#text

一個目の DNS エレメントの中身(attributes と子エレメント)をみる。

irb(main):086:0> dsn.get_elements('//DSN')[0].each_element {|x| 
p [x.name, x.text, x.attributes] }
["SOURCE", "Anabaena", {"id"=>id='Anabaena'}]
["MAPMASTER", "http://g.kazusa.or.jp/cgi-bin/das/Anabaena", {}]
["DESCRIPTION", "Anabaena", {}]
=> [<SOURCE id='Anabaena'> ... </>, <MAPMASTER> ... </>, <DESCRIPTION> ... </>]
  • REXML::Element#each_element
  • REXML::Element#name
  • REXML::Element#text
  • REXML::Element#attributes

まとめ

  1. REXML の使い方は ruby-refm-1.8.6-chm を Chmox.app で参照。これは便利。
    1. 404 Not Found
    2. 404 Not Found -- Web 版
    3. no title
  2. doc.get_elements('//DSN/SOURCE').map {|x| x.text } から名前とインデックスをつくって、doc.get_elements('//DSN/')[i] にアクセスすればよさそう。
  3. というか、XPath でごにょごにょするほうが良い予感がした。
トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080120