0

html および xml ページへのリンクを含むリンクのリストがあります。リストから xml リンクを抽出するにはどうすればよいですか? Javaで

ありがとう

4

2 に答える 2

2

一般的なファイル名拡張子のリストを使用して、特定の URL に保存されているデータの種類を推測できますが、特に Web 2.0 サイトでは、あまり信頼できないことがよくあります (この SO の質問自体の URL を見てください)。さらに、PHP スクリプト (.php) またはその他の動的コンテンツ サイトへのリンクは、HTML または XML を返す可能性があります。または、JPG ファイルなど、まったく別のものを返すこともできます。

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

また、 MIME タイプ( text/htmltext/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);
    }
}
于 2012-04-10T07:03:35.710 に答える
1

リンクが何らかのLinkオブジェクトであるかどうかはわかりませんが、値に文字列としてアクセスできる限り、これはうまくいくはずです。

List<String> xmlLinks = new ArrayList<String>();
for (String link : list) {
  if (link.endsWith(".xml") || link.contains(".xml")) {
    xmlLinks.add(link);
  }   
} 
于 2012-04-10T03:02:44.623 に答える