我有一个链接列表,其中包含指向html和xml页面的链接,如何从列表中提取xml链接?在java中
感谢
答案 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);
}
}