URIからURIへの相対URIの求め方

このQ&Aのポイント
  • Javaの標準ライブラリか何かで、uri1からuri2への相対パスを求めるアルゴリズムは存在するか
  • uri1.relativize(uri2)では正しい結果が得られない
  • 自前で作成した相対パスの求め方にバグが見つかり、広く使われているモジュールを使用したい
回答を見る
  • ベストアンサー

URIからURIへの相対URIの求め方

URI uri1 = URI("./a1/a2/a3");(もしくはURI("C:/a1/a2/a3")) と URI uri2 = URI("./b1/b2/b3");(もしくはURI("C:/b1/b2/b3")) という2つのURIがあって、 uri1からuri2への相対パス ../../../b1/b2/b3 を求めたいのですが、 Javaの標準ライブラリか何かで、 このアルゴリズムはサポートされていないでしょうか。 ちなみに、目をつけてみた uri1.relativize(uri2) では、 ./b1/b2/b3 の結果になってしまいます。 自前で作成したものにバグが見つかったので、 できれば広く使われているモジュールを使用したいのです。

  • ggaogg
  • お礼率86% (209/243)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

例によって未解決。中間報告のみ。 >Javaの標準ライブラリか何かで、 このアルゴリズムはサポートされていないでしょうか。 一応ドキュメントにはそれらしき箇所があるのだけれど, http://java.sun.com/javase/6/docs/api/java/net/URI.html#relativize(java.net.URI) >if the path of this URI is not a prefix of the path of the given URI, then the given URI is returned. url2がurl1のディレクトリの子孫にあたる時 public class Q3641263A{ public static void main(String[] args){ try{ java.net.URI uri1 = new java.net.URI("./a1/a2/a3/"); java.net.URI uri2 = new java.net.URI("./a1/a2/a3/a5"); System.out.println(uri1.isOpaque()); System.out.println(uri2.isOpaque()); System.out.println(uri1.relativize(uri2)); }catch(java.net.URISyntaxException e){ System.out.println(e.getStackTrace()); } } は,希望通り(正常に、とか正しく、とか言わないw) a5が返る http://bugs.sun.com/view_bug.do?bug_id=6226081 も少し気になっている。 #このバグに投稿されているコード,少なくとも一方が絶対URIなので isOpaqueでメソッドの引数のURIがそのまま返ったりしないのだろうか・・・ ===== 余談つーかブログから 同じようなものをC#で書くと・・・ [C#] namespace P20080101B { class P20080101B { public static void Main(string[] args) { System.Uri address1 = new System.Uri("http://a1/a2/a3/"); System.Uri address2 = new System.Uri("http://a1/b2/b3/"); System.Console.WriteLine("The difference is {0}", address1.MakeRelativeUri(address2)); } } } 結果: The difference is ../../b2/b3/ namespace P20080101C { class P20080101C { public static void Main(string[] args) { System.Uri address1 = new System.Uri("http://a1/a2/a3/"); System.Uri address2 = new System.Uri("http://a1/a2/a3/b1/"); System.Console.WriteLine("The difference is {0}", address1.MakeRelativeUri(address2)); } } } 結果: The difference is b1/ と,どちらでも可能だ。 ただし,コンストラクタにRelativeURIを指定できそうになく。 ==================== 回避策・他ライブラリは現在の所発見できていません。 =========== >自前で作成したものにバグが見つかったので、 後学のためソースの提出とバグの解説が読みたいな

ggaogg
質問者

お礼

うーん、Javadocの英語読んでみて、さっぱりわからなかったので、日本語のJavadoc読んでみたのですが、あまりわからず。。 英語の読解力の低さもさることながら、専門用語の語彙もかなり低いみたいです。。 himajin10万さんは調べるのうまいですねー。 日本語では検索ワードとか思いつくんですけど、英語だとなんて検索していいかわからなくて・・。 最近やっと英語の技術書1冊読んだ程度の英語力なので、とりあえずあてずっぽ読みはできても検索のための文つくるとか流し読みでリンク辿るといったことがまだできない状況で。 そのようなライブラリが他に用意されていないのは以外でした。 どこかにベンダーがあってもおかしくないと思っていただけに。 自作したものは、URIではなく、Fileを扱うものです。 ライブラリを探す時間が惜しいという理由から作成したものなので、機能はとりあえずのものしかありませんが・・。 バグは、ありませんでした。 結局、呼び出したソースのほうに問題があったみたいです。 自作モジュールだと、テストをきちんとしていないため、すぐにバグを疑ってしまいます・・。 そういう点からも、よくテストされたモジュールほしいですよね。。 ソース提出の件等も含めて、また遊びにいきます。 いつもありがとうございます!

関連するQ&A

  • C# 2つのフォルダの相対パスを求めたいが…

    お世話になります。 二つのフォルダの相対パスを求めるメソッドを組みたいのですが、 MakeRelativeUriメソッドを使用すると実行時にどうしても InvalidOperationExceptionが出てしまいます。 下記がそのソースです。 string stPath = "C:/a/~~~"; stPath = stPath.Replace("/","\\"); Uri uri = new Uri(Path.GetFullPath(stPath + "\\")); // ディレクトリをと取得 string[] stDirectories = Directory.GetDirectories(stPath); foreach (string s in stDirectories) { string st = s.Replace("/", "\\"); Uri uri2 = new Uri(Path.GetFullPath(st + "\\")); Uri uri3 = uri2.MakeRelativeUri(uri); } 他のサイト様を拝見して、気を付けている点は、 1、相対ではなく、絶対で指定する。 2、末尾に"\\"を付ける。 3、"/"ではなく、"\\"に変更する の3点です。 それとも、MakeRelativeUriメソッドはフォルダには使えないのでしょうか? それとも、パスの中に2バイト文字が入っていてはダメ? 解決策をお願いいたします。 VC#2010Expressです。

  • 初めてcgiをしています 相対passについて

    自分のURL/A/B/C/D Dから他のファイルへの相対パス。最後に「/」をつけないことの場合 の相対パスはどうなるんでしょうか・・・・ $dir = '.'; の記述がわからなくて・・・つまらない質問だと思うのですが 身近にわかる人がいないため聞けずこまっています・・・

    • 締切済み
    • CGI
  • URI引数の書き換え

    こんにちは。 ASP.NET2.0を使っています。 文字列として渡されたURIの引数を入れ替えたいのですが、 なにかよい方法はないものでしょうか? 例えば、 http://xxxxxx/yyyy.aspx?A=XXXX&B=YYYY といった形である場合に、A=XXXXを入れ替えて、 http://xxxxxx/yyyy.aspx?A=ZZZZ&B=YYYY としたいのです。 このとき、引数にAがなく、 http://xxxxxx/yyyy1.aspx?B=YYYY といった形であった場合にはなにもしません。 また、A以外の引数やパスの部分は任意です。 もちろん、XXXXの部分も不定です。 言語はC#を使っています。よろしくお願いします。

  • #pragma commentの相対パス指定

    #pragma commentの相対パス指定について、希望の動作をしないません。 状況は以下の通りです。 libというフォルダの中にlibA、libBの二つのフォルダがあり、それぞれのフォルダの中には、lib_a.lib、mylib_b.libというファイルがあるとします。 lib -libA -lib_a.lib -libB -lib_b.lib またライブラリディレクトリにはlibのパスのみが指定されていたとします。 この状況で#pragma comment(lib,"libA\\lib_a.lib")とすると、 「LINK : fatal error LNK1104: ファイル 'libA\lib_a.lib' を開くことができません。」 と出てしまいます。 #pragma commentの中では、相対パスは使えるはずなのですが、なぜこの場合はリンクが出来ないのでしょうか? ちなみに絶対パスで指定した場合はエラーは出ません。 できればフォルダで分割してライブラリを管理したいと考えているので、何か解決方法をご存知の方がいれば、ご教授ください。 環境は ・OS:Windows7 ・使用ソフト:Visual C++ 2010 Express ・言語:C++ です。

  • ExcelVBAで標準モジュールを違うブックでも参照したい

    お世話になります。 かなり初歩的な質問で申し訳ありません。 とあるAというブックで作成した標準モジュールを、異なるBという ブックでも使えるようにしたいのですが、すでに知っている方法では 使用したいA側のモジュールをエクスポートし、B側のブックに インポートするといった方法ですが、これだと面倒ですし、 ひとつを書き換えたらほかのブックのモジュールもその都度 書き換えなければなりません。 要は、C言語のようにライブラリ化したいのですが、これって できるのでしょうか? よろしくお願いいたします。

  • 相対価格について

    相対価格についていまいちわかりません。次のような問題の解答は、相対価格の高い順で(b)→(c)→(a)でよろしいのでしょうか? 〔問題〕 次の(a)(b)(c)はばななとメロンを物々交換する場合の交換個数を表している。(a)(b)(c)をばななとメロンに対する相対価格が高い順に並べよ。 (a)ばなな2個とメロン5個 (b)ばなな3個とメロン4個 (c)ばなな4個とメロン6個

  • Winのショートカット 相対パスの記述

    CドライブにAというフォルダがあって、その中に Bというフォルダがあり、その中にb.htmというファイルがあります。 このc.htmのショートカットを作ると、 そのパスは c:\A\B\c.htm と絶対パスになっています。 このままだと、このAというフォルダを を他のドライブに移したとき、ショートカットが 機能しなくなります。 ショートカットをAフォルダー内(Bフォルダの外) に置いて、相対パスと指定したいのですが どうすればいいのでしょうか? \\A\B\c.htm ? .\A\B\c.htm ? いづれも駄目でした。 どうすればいいのでしょうか? AフォルダごとCD-Rに焼きたいのですが、 CDドライブがDドライブになると限らない わけで、ドライブが変わっても、ショート カットが使えるようにしたいのですが。

  • javaの中で環境変数を設定する。

    javaの記述内で環境変数を設定する事は出来るのでしょうか? osはredhat linuxです。 具体的にはJAVAからCのモジュールをSystem.loadLibraryで 読み込んでいますが、環境変数LD_LIBRARY_PATHから探しに行くと思います。 このCのモジュールのパスを外部ファイルに持たせ、変更できるようにしたいのです。 何か良い方法がありますでしょうか? 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • トップページへの相対パスについて

    皆さんこんにちは。 現在、大きく3つにフォルダを分けhtmlや画像をまとめています(仮にa、b、c)。 その中のaフォルダの中にある「top.html」を 全体のトップページとして扱い、abcフォルダ内の全てのページから相対パスでリンクを張っています。 現在「http://~~~com/a/top.html」となっているこのページに、 「http://www.○○.net」と任意のアドレスを指定すると相対パスが全て効かなくなってしまいますか? 効かなくなってしまうのなら、何かいい方法はないでしょうか。。 お願いします!

    • ベストアンサー
    • HTML
  • IEでのURIエンコーディングに関するトラブル

    現在CGIプログラム(Perlプログラム)を作成しています。 そのプログラムではHTMLのFORMで日本語テキスト(Shift_JIS)を入力させ、CGIにクエリとしてそれを受け渡します。 例えば、テキストとして「貴社の記者」をURIエンコーディングさせると、「貴」は8B4D、「社」は8ED0、「の」は82CC、「記」は8B4C、「者」は8ED2(全てShift_JIS)なので、 %8B%4D%8E%D0%82%CC%8B%4C%8E%D2 とエンコードされると思います。 しかし、実際Internet Explorerでクエリを送信してみると、 %8BM%8E%D0%82%CC%8BL%8E%D2 というクエリが送信されているようです。 URIエンコードは%の次は2桁の16進数が来ると聞いているので、今回の文字列に3桁、しかも、最後の桁の文字は16進数ではないのか分かりません。 ・プログラム部分 $query = $ENV{'QUERY_STRING'}; @pairs = split(/&/, $query); foreach (@pairs) { ($name,$value) = split(/=/); $in{$name} = $value; } $u = $in{'sentence'}; $u =~ tr/[a-f]/[A-F]/; $u =~ tr/+/ /; $u =~ s/%([A-F0-9]{2})%([A-F0-9]{2})/&decodechar($1 . $2)/eg; の様な形で、「貴」だったら「%8B%4D(%8BM)」のクエリから「8B4D」を、「社」だったら「%8E%D0」のクエリから「8EDO」を文字列として取り出したいと思っています。 # 最後にdecodechar関数を使用していますが、直接テストをした際は問題なく動いているので、その部分にバグはないようです。 Shift_JISの日本語文字列をURIエンコーディングしたときに、なぜこの現象が起こるのか、また、この現象が起きたときの対策を誰かご存じの方いらっしゃいますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう