如何区分java中的xml和html链接

时间:2012-04-10 02:55:26

标签: java xml

我有一个链接列表,其中包含指向html和xml页面的链接,如何从列表中提取xml链接?在java中

感谢

2 个答案:

答案 0 :(得分:2)

您可以使用常用文件扩展名列表来查看存储在给定URL中的数据类型,但这通常不会非常可靠,特别是对于Web 2.0站点(只需查看此SO问题本身的URL) )。此外,指向PHP脚本(.php)或其他动态内容站点的链接可以返回HTML或XML。或者它可以完全返回其他内容,例如JPG文件。

您可以使用许多简单的启发式方法来检测HTML与XML,只需查看文件的开头即可。例如,您可以查找<!DOCTYPE ...>声明,检查<?xml ...?>指令,并检查该文件是否包含根<html>标记。当然,这些都应该是不区分大小写的检查。

您还可以尝试根据MIME type标识文件类型(例如, text / html text / 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 :(得分:1)

我不确定您的链接是否是某种Link对象,但只要您可以将该值作为字符串访问,我认为这应该可行。

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