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

标签 java xml

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

谢谢

最佳答案

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

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

您还可以尝试根据 MIME type 来识别文件类型(例如,text/htmltext/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);
    }
}

关于java - java中如何区分xml和html链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10082568/

相关文章:

xml - SoapUI GroovyScript 断言在预期值的 (+ 或 -) 0.05 范围内

java - 如何提及类路径

java - 如何使用正则表达式获取与模式完全匹配的单词

java - 在二叉树中,检查给定节点是否为叶节点

xml - 使用 Xpath 2.0 选择具有特定属性的唯一元素列表的 XPath

c# - <> 转换为 64BaseString 和从 64BaseString 时 Xml 丢失

.net - XDocument.Load(feedUrl)返回 "Data at the root level is invalid. Line 1, position 1."

java - 玩!框架——ORM

java 8 过滤一个 ListOfMap 用于检查一个键是否存在,如果存在则收集一个映射

xml - 可以定义 B.C.使用 xsd :dateTime? 的日期