2012-04-10 17 views
0

我有一個鏈接列表,其中包含指向html和xml頁面的鏈接,我如何從列表中提取xml鏈接?在Java中如何在java中區分xml和html鏈接

感謝

+0

看看它是否以「.xml」結尾? – 2012-04-10 02:59:54

+1

多一點說明會有幫助。 – kentcdodds 2012-04-10 04:37:35

+1

你能從鏈接列表中發佈一些例子嗎? – bmkorkut 2012-04-10 07:57:20

回答

2

你可以使用常見的文件擴展名列表,可以洞察到存儲在一個給定的URL數據的類型,但通常不會是非常可靠的,尤其是Web 2.0網站(只是看的URL這個問題本身)。另外,PHP腳本(.php)或其他動態內容站點的鏈接可以返回HTML或XML。或者它可能完全返回其他內容,例如JPG文件。

簡單地通過查看文件的開頭,有許多簡單的啓發式方法可用於檢測HTML和XML。例如,您可以查找<!DOCTYPE ...>聲明,檢查<?xml ...?>指令,然後檢查文件是否包含根<html>標記。當然,這些都應該是不區分大小寫的檢查。

您也可以嘗試識別文件的基礎上,其類型MIME type(例如,text/html的文本/ XML)。不幸的是,許多服務器返回不正確或無效的MIME類型,因此您通常必須閱讀文件的開頭部分才能發現其內容,正如您可以在下面的getMimeType()方法的前兩個不足版本中看到的那樣。第三次嘗試效果更好,但第三方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

我不能肯定,如果你的鏈接是某種Link的對象,但只要你可以作爲一個字符串訪問值這應該工作,我認爲。

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