2012-04-10 9 views
0

私はリンクのリストをhtmlとxmlページへのリンクが含まれていますが、どのようにリストからXMLリンクを抽出できますか?xmlとjavaのhtmlリンクを区別する方法

おかげ

+0

「.xml」で終わるかどうかを確認しますか? –

+1

もう少し説明すれば助かります。 – kentcdodds

+1

リンクのリストからいくつかの例を投稿できますか? – bmkorkut

答えて

2

あなたは指定されたURLに格納されたデータの種類を占うために、共通のファイル名の拡張子のリストを使用することができますが、それは多くの場合、特にWeb 2.0のサイトで、非常に信頼されません(だけのURLを見てくださいこれは質問自体です)。さらに、PHPスクリプト(.php)やその他の動的コンテンツサイトへのリンクは、HTMLまたはXMLのいずれかを返す可能性があります。あるいは、JPGファイルのように完全に何かを返すこともできます。

ファイルの先頭を見るだけで、HTMLとXMLを検出するための多くの簡単な発見的方法があります。たとえば、<!DOCTYPE ...>宣言を探して、<?xml ...?>ディレクティブを確認し、ファイルにルート<html>タグが含まれているかどうかを確認します。もちろん、これらはすべて大文字小文字を区別しないチェックでなければなりません。

また、そのMIME type(例えば、text/htmlのまたはtext/xmlで)に基づいて、ファイルの種類を識別するために試すことができます。残念なことに、多くのサーバーでは不正または無効なMIMEタイプが返されるため、以下のgetMimeType()メソッドの最初の2つの不適切なバージョンで見られるように、ファイルの開始部分を読みとる必要があります。 3番目の試みはうまくいったが、サードパーティ製のMimeMagicライブラリは依然として残念な結果をもたらした。それにもかかわらず、前述の追加ヒューリスティックを使用して、getMimeType()メソッドを置き換えるか改善することができます。

package com.example.mimetype; 

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.FileNameMap; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import net.sf.jmimemagic.Magic; 
import net.sf.jmimemagic.MagicException; 
import net.sf.jmimemagic.MagicMatchNotFoundException; 
import net.sf.jmimemagic.MagicParseException; 

public class MimeUtils { 

    // After calling this method, you can retrieve a list of URLs for each mimetype. 
    public static Map<String, List<String>> sortLinksByMimeType(List<String> links) { 
     Map<String, List<String>> mapMimeTypesToLinks = new HashMap<String, List<String>>(); 

     for (String url : links) { 
      try { 
       String mimetype = getMimeType(url); 

       System.out.println(url + " has mimetype " + mimetype); 

       // If this mimetype hasn't already been initialized, initialize it. 
       if (! mapMimeTypesToLinks.containsKey(mimetype)) { 
        mapMimeTypesToLinks.put(mimetype, new ArrayList<String>()); 
       } 

       List<String> lst = mapMimeTypesToLinks.get(mimetype); 
       lst.add(url); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     return mapMimeTypesToLinks; 
    } 

    public static String getMimeType(String url) throws MalformedURLException, IOException, MagicParseException, MagicMatchNotFoundException, MagicException { 
     // first attempt at determining MIME type--returned null for all URLs that I tried 
//  FileNameMap filenameMap = URLConnection.getFileNameMap(); 
//  return filenameMap.getContentTypeFor(url); 

     // second attempt at determining MIME type--worked better, but still returned null for many URLs 
//  URLConnection c = new URL(url).openConnection(); 
//  InputStream in = c.getInputStream(); 
//  String mimetype = URLConnection.guessContentTypeFromStream(in); 
//  in.close(); 
//  return mimetype; 

     URLConnection c = new URL(url).openConnection(); 
     BufferedInputStream in = new BufferedInputStream(c.getInputStream()); 
     byte[] content = new byte[100]; 
     in.read(content); 
     in.close(); 

     return Magic.getMagicMatch(content, false).getMimeType(); 
    } 

    public static void main(String[] args) { 
     List<String> links = new ArrayList<String>(); 
     links.add("http://stackoverflow.com/questions/10082568/how-to-differentiate-xml-from-html-links-in-java"); 
     links.add("http://stackoverflow.com"); 
     links.add("http://stackoverflow.com/feeds"); 
     links.add("http://amazon.com"); 
     links.add("http://google.com"); 

     sortLinksByMimeType(links); 
    } 
} 
1

JavaであなたのリンクはLinkオブジェクトのいくつかの並べ替えている場合、私は確かではないんだけど、限り、あなたは文字列として値にアクセスすることができますので、これは私が考えて動作するはずです。

List<String> xmlLinks = new ArrayList<String>(); 
for (String link : list) { 
    if (link.endsWith(".xml") || link.contains(".xml")) { 
    xmlLinks.add(link); 
    } 
} 
関連する問題