2012-04-10 7 views
0

Ich habe eine Liste von Links, die Links zu HTML-und XML-Seiten enthalten, wie kann ich die XML-Links aus der Liste extrahieren? in JavaWie unterscheidet man XML von HTML-Links in Java

dank

+0

Sehen Sie, wenn es mit ".xml" endet? –

+1

Ein wenig mehr Beschreibung wäre hilfreich. – kentcdodds

+1

Können Sie ein Beispiel aus Ihrer Linkliste hochladen? – bmkorkut

Antwort

2

Sie eine Liste der gemeinsamen Dateierweiterungen verwenden könnten die Art der Daten zu einem bestimmten URL gespeichert prophezeien, aber das wird oft nicht sehr zuverlässig sein, vor allem mit Web-2.0-Seiten (unter der URL schauen nur von diese SO Frage selbst). Darüber hinaus kann eine Verknüpfung zu einem PHP-Skript (.php) oder einer anderen Website mit dynamischen Inhalten entweder HTML oder XML zurückgeben. Oder es könnte etwas ganz anderes zurückgeben, beispielsweise eine JPG-Datei.

Es gibt viele einfache Heuristiken, die Sie für die Erkennung von HTML vs. XML verwenden können, indem Sie einfach auf den Anfang der Datei schauen. Beispielsweise können Sie nach der <!DOCTYPE ...>-Deklaration suchen, nach der <?xml ...?>-Direktive suchen und überprüfen, ob die Datei ein Stamm-<html>-Tag enthält. Natürlich sollte es sich bei allen um Groß- und Kleinschreibung handeln.

Sie können auch die Art der Datei versuchen, auf der Grundlage seiner MIME type (zB text/html oder text/xml) zu identifizieren. Leider geben viele Server falsche oder ungültige MIME-Typen zurück, so dass Sie den Anfang der Datei oft lesen müssen, um den Inhalt zu verstehen, wie Sie in meinen ersten beiden unangemessenen Versionen einer getMimeType() - Methode sehen können. Der dritte Versuch funktionierte besser, aber die MimeMagic-Bibliothek von Drittanbietern lieferte immer noch enttäuschende Ergebnisse. Nichtsdestoweniger könnten Sie die oben erwähnten zusätzlichen Heuristiken verwenden, um die Methode getMimeType() entweder zu ersetzen oder zu verbessern.

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

Ich bin nicht sicher, ob Ihre Links eine Art Link Objekt sind, aber solange Sie den Wert als String zugreifen kann dies sollte ich denke arbeiten.

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