Hatena::Groupkdri

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

2008-04-20

gbrowse の cgi-bin/das は文字列のエスケープ処理をしていないので、Invalid は XML を書き出してしまうことがある。

|  gbrowse の cgi-bin/das は文字列のエスケープ処理をしていないので、Invalid は XML を書き出してしまうことがある。 - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  gbrowse の cgi-bin/das は文字列のエスケープ処理をしていないので、Invalid は XML を書き出してしまうことがある。 - KazusaAPI開発日誌  gbrowse の cgi-bin/das は文字列のエスケープ処理をしていないので、Invalid は XML を書き出してしまうことがある。 - KazusaAPI開発日誌 のブックマークコメント

DASGFF XML の NOTE エレメントのテキストに & があるときに、そのまま & にしていた。これは Invalid な XML になってしまい、XML パーザが許容しない。Ruby だと #<RuntimeError: Illegal character '&' in raw string "two-component hybrid sensor & regulator"> (REXML::ParseException) のようなことになる。

<NOTE tag="Note">two-component hybrid sensor & regulator</NOTE>

これは次のようにエスケープされるべきである。

<NOTE tag="Note">two-component hybrid sensor &amp; regulator</NOTE>

ruby で REXML を使用して XML 文章をつくると、次のようにエスケープされる。

>> require 'rexml/document'
=> true
>> doc = REXML::Document.new
=> <UNDEFINED/>
>> doc.add_element('NOTE').add_text("A & B").to_s
<NOTE>A &amp; B</NOTE>

コードの改変で対応してみた。

gbrowse-1.69 の cgi-bin/das の 386 行と 392 行を改変して対応した。

385   if (@notes) {
386     $group_info = join "\n",map {qq(<NOTE>) . escapeHTML($_) . qq(</NOTE>)} @notes;
387   }
388 
389   if ($attributes) {
390     for my $tag (keys %$attributes) {
391       my @values = ref($attributes->{$tag}) ? @{$attributes->{$tag}} : $attributes->{$tag};
392       $group_info .= qq(\n\t<NOTE tag="$tag">) . escapeHTML($_) . qq(</NOTE>) foreach @values;
393     }
394   }

基本的には、qq(<NOTE>$_</NOTE>) を qq(<NOTE) . escapeHTML($_) . qq(</NOTE>) のように escapeHTML を使うようにした。

まとめ

  1. gbrowse 1.69 の das の出力に不正なXMLがあることがある。
  2. 原因はXML文章作成時にエスケープ処理をしていないこと。
  3. das のソースコードを改変して対応した。
トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20080420